Operační systémy MIPS, Kalisto a správa paměti http://d3s.mff.cuni.cz Martin Děcký Vojtěch Horký nswi004@d3s.mff.cuni.cz CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics
Operační systémy, ZS 2015/2016 2 Ovládání MSIMu Spuštění msim [-c <config file>] [-i] [-t] Základní příkazy add dd mbd set přidání zařízení/pamět zobrazení zařízení zobrazení mapy pamět nastavení interních řídících proměnných iaddr, iopc, icmt, iregch, ireg, trace
Operační systémy, ZS 2015/2016 3 Ovládání MSIMu (2) Základní příkazy (2) step [n] continue md id stats echo help quit Speciální ladící instrukce provedení n instrukcí simulace výpis fyzické pamět výpis instrukcí ve fyzické pamět běhové statstky výpis řetězce DTRC, DTRO, DINT, DRV, DHLT, DVAL
Ovládání MSIMu (3) Nahlédnutí do fyzické pamět md 0x1fc00000 4 obsah pamět hexdump loader.bin id 0x1fc00000 4 obsah pamět s instrukcemi cat loader.disasm Operační systémy, ZS 2015/2016 4
Konfigurace MSIMu add dcpu cpu0 add rwm main 0 main generic 16M add rom bios 0x1fc00000 bios generic 32k bios load bios.img add dprinter output 0x10000000 add dkeyboard input 0x10000008 3 cpu0 info output redir dump.log stat tlbd md id Operační systémy, ZS 2015/2016 5
MIPS R4000 Architektura Load/store model instrukční sady Jednoduchá pipeline Většina instrukcí potřebuje jeden cyklus Během provádění instrukce se dekóduje další Branch delay slot System Control Coprocessor (CP0) Řídící registry, změna režimu procesoru Operační systémy, ZS 2015/2016 6
MIPS R4000: memory management Virtuální adresový prostor rozdělen na pevně dané segmenty Nulaúrovňové (TLB only) stránkování Virtuální KSEG3 KSEG2 (KSSEG) KSEG1 (obchází cache) KSEG0 (lze cachovat) KUSEG (2 GB dostupné z uživatelského prostoru) 0xFFFFFFFF 0 Fyzická 3.5 GB 512 MB Operační systémy, ZS 2015/2016 7
Operační systémy, ZS 2015/2016 8 Kalisto Samotné jádro kernel.bin Načteno do RAM na fyzickou adresu 0 Zavaděč loader.bin Načteno do ROM na fyzickou adresu 0x1FC00000 physical memory 0xFFFFFFFF 0x80000000 0x1FC00000 loader.bin 0x00000000 kernel.bin virtual memory 0xFFFFFFFF loader.bin 0x80000000 kernel.bin 0x1FC00000 0x00000000
Zavaděč loader.bin Role firmware Jediný zdrojový soubor kernel/boot/loader.s Skok na adresu, na které je vstupní rutna jádra Fyzická adresa 0x00000300, virtuální adresa 0x80000300 Vždy přístupná v nemapovaném segmentu nad 2 GB Použití céčkového preprocesoru v assembleru Konstanta KERNEL_ENTRY_POINT Makro ADDR_IN_KSEG0(0x300) Operační systémy, ZS 2015/2016 9
Operační systémy, ZS 2015/2016 10 Jádro kernel.bin Linkování více objektových souborů Linker skript kernel/kernel.lds Standardní výstupní formát ELF (kernel.raw) Plochý binární formát (bez hlaviček) vytvořen utlitou objcopy (volá se z kernel/makefile) Linkováno relatvně vůči bázové adrese 0x80000000 Jediná výstupní sekce.kernel Vstupní sekce.excvec vždy na začátku (kvůli přesným offsetům) Následují další vstupní sekce Explicitně se zahazují sekce.eh_frame a.reginfo Definice symbolu _kernel_end
Operační systémy, ZS 2015/2016 11 Inicializace jádra (kernel/main.c) bsp_start() Globální inicializace jádra (na bootstrap CPU) tbl_init() memory_init() threads_init() scheduler_init() vyčištění TLB zjištění velikost fyzické pamět inicializace alokátoru inicializace podpory vláken inicializace struktur plánovače nastavení registru časovače inicializace podpory časovačů timers_init() Vytvoření idle vlákna Vytvoření vlákna, výkonná funkce example() Aktvace dalšího CPU: ap_start() Inicializace plánovače, idle vlákno Přepnutí na kontext vlákna Vlastní zásobník, odmaskování výjimek
Inicializace paměti memory_init() Volná paměť začíná za kódem a statckými daty kernelu extern uint8_t _kernel_end; (definován v linker skriptu) Detekce pamět Zapsání a přečtení stejných dat Testuje se po blocích Hrubý algoritmus, který nedetekuje přesné hranice pamět Operační systémy, ZS 2015/2016 12
Alokátor haldy kernel/mm/malloc.c Jednoduchý first-fit algoritmus Po inicializaci jediný prázdný blok [heap_start; heap_end] Na začátku bloku struktura heap_block_head_t Na konci bloku struktura heap_block_foot_t Funkce malloc() štěpí volné bloky Funkce free() uvolňuje obsazené bloky a slévá dohromady sousední volné bloky H F H F H F Operační systémy, ZS 2015/2016 13
Správa paměti TLB 48 záznamů Každý záznam obsahuje dvě položky mapování stránka:rámec Stránky velikost 4 KB, 16 KB,..., 4 MB a 16 MB Nejvyšší tři bity stránky určují segment a typ přístupu 000 011 (0 2 GB) Uživatelský segment 100 101 (2 3 GB) Dva privilegované nemapované segmenty 110 111 (3 4 GB) Privilegovaný mapovaný segment kernel mapped kernel unmapped user 4 GB 3 GB 2 GB 0 Operační systémy, ZS 2015/2016 14
Operační systémy, ZS 2015/2016 15 Překlad virtuálních adres virtual address ASID page number offset TLB TLB entry G ASID page number frame number frame number offset physical address
Datové struktury kernel/adt/atomic.h Atomický číselný typ atomic_t kernel/adt/list.c Implementace jednoduchých spojových seznamů kernel/mm/malloc.c Hlavičky a patčky paměťových bloků heap_block_head_t heap_block_foot_t pole s magickou hodnotou pro detekci poškození Operační systémy, ZS 2015/2016 16
Operační systémy, ZS 2015/2016 17 Miscellanea kernel/drivers/printer.h Znakový výstup pomocí zařízení dprinter kernel/lib/debug.h Makro assert kernel/lib/print.c Výstupní rutny (analogie printf()) kernel/tests Ukázkové kernelové testy
Q&A Operační systémy, ZS 2015/2016 18