Operační systémy MIPS, Kalisto a správa paměti http://d3s.mff.cuni.cz
Martin Děcký Vojtěch Horký
[email protected]
CHARLES UNIVERSITY IN PRAGUE faculty faculty of of mathematics mathematics and and physics physics
Ovládání MSIMu Spuštění msim [-c
] [-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
2
Ovládání MSIMu (2) Základní příkazy (2) step [n] continue md id stats echo help quit
provedení n instrukcí simulace výpis fyzické pamět výpis instrukcí ve fyzické pamět běhové statstky výpis řetězce
Speciální ladící instrukce DTRC, DTRO, DINT, DRV, DHLT, DVAL
Operační systémy, ZS 2015/2016
3
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 stat tlbd md id output redir “dump.log“
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)
0xFFFFFFFF
KSEG0 (lze cachovat)
3.5 GB
KUSEG (2 GB dostupné z uživatelského prostoru) 0 Operační systémy, ZS 2015/2016
Fyzická
512 MB 7
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 Operační systémy, ZS 2015/2016
8
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
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
10
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
Operační systémy, ZS 2015/2016
11
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
Operační systémy, ZS 2015/2016
F
H
F
H
F
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
Operační systémy, ZS 2015/2016
kernel mapped kernel unmapped
4 GB 3 GB 2 GB
user 0
14
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 Operační systémy, ZS 2015/2016
15
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
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
Operační systémy, ZS 2015/2016
17
Q&A
Operační systémy, ZS 2015/2016
18