PB173 - Ovladače jádra - Linux v. Jiří Slabý ITI, Fakulta Informatiky 26. 10. 2010 J. Slabý (ITI) PB173/01 26. 10. 2010 1 / 1 Práce s pamětí LDD3 kap. 8 (zastaralá část o bootmem) Understanding the Linux Virtual Memory Manager (zastaralá) a Organizace paměti • Alokace paměti J. Slabý (ITI) PB173/01 26. 10. 2010 2/1 Organizace paměti 2 oddělené světy (tentokrát z pohledu HW) Fyzický prostor • Rozložení určuje BIOS (popř. ekvivalenty - (U)EFI, Qemu) a X86: dmesg|grep BIOS-e820 Virtuální prostor (paměť) a Rozložení si určuje OS • Různé na každé architektuře • Dané mapování mezi VP a FP a Nutná podpora HW (MMU), jinak mapování 1:1 J. Slabý (ITI) PB173/01 26. 10. 2010 3/1 Organizace paměti - graficky BIOS Userspace (differs per process) RAM I -5- ACPI Timer Hole PCI devices Physical memory Empty Hole Kernel Modules Fyzický prostor • To, co vidí MMU • RAM, časovače, řadiče přerušení, ACPI tabulky, zařízení • Co kde je => otázka na BIOS « Jak který prostor vypadá => specifikace bridge, ACPI, PCI, ... • I hierarchický prostor • Např. rozsah 100-1 ff ^ ChipXY 0 ChipXY směruje dále: • Adresa 100-18f —>• řadič klávesnice • Adresa 190-1 ff časovač RAM • Reprezentována rozsahy lineárních (fyzických) adres • Rozsahy kvůli vloženým prostorům zařízení (e820) « Cache (některá zařízení také) J. Slabý (ITI) PB173/01 26. 10. 2010 5/1 Úkol Práce s fyzickou adresou - přečtení signatury a délky nějaké ACPI tabulky z fyzické adresy O Najít fyzickou adresu nějaké ACPI tabulky v dmesg • Řádky formátu acpi: rsdp OOOOOOOOOOOf 8550 00014 a Jeden si zvolit a zapamatovat adresu (0x00000000000f 8550) 0 Získat Virtuální adresu (u32 *virt = ioremap (phys, 8)) Q Vypsat signaturu (text, 4B - virt [ 0 ]) O Vypsat délku tabulky (4B - virt [ 1 ]) O Odmapovat (iounmap (virt) ) 0 Porovnejte délku s výpisem (0x00014) O Můžete si přemapovat a vypsat celou tabulku a porovnat položky se specifikací ACPI Pozn.: na starších jádrech se výpis v dmesg liší J. Slabý (ITI) PB173/01 26. 10. 2010 6/1 Virtuální prostor • To, co vidí CPU (a překládá MMU) 9 11:1- start systému, noMMU, ... • OS „rozdělí" FP na stránky • I různě velké • Pak mají jiné virtuální adresy • Např. přístupy programů po 4K, přístupy jádra po 1G (méně tabulek) • Index stránky je tzv page frame number (pfn) • OS namapuje stránky do VP • A může přidat „virtuální" stránky např. na disku (swap) • Programy vidí více „paměti" • Toto mapování čte MMU (ví odkud) a Každá stránka má svoji struct page • Informace o stránce (nikdy nevyswapovat, špinavá, počet uživatelů) J. Slabý (ITI) PB173/01 26. 10. 2010 7/1 Grafické shrnutí Zdroj: wikipedia 26. 10. 2010 8/1 Operace s adresami • linux/mm.h, linux/io.h • Napr. void * virt=__get_f ree.page • phys_addr_t phys=virt_to_phys (virt) • void *virt — phys_to_virt (phys) • struct page *page=virt_to_page(virt) a void *virt=page_to_virt (page) • unsigned long pf n=virt_to_pfn (virt) • void *virt=pfn.to.virt (pfn) • unsigned long pfn=phys >> PAGE_SHIFT • phys_addr_t phys=pfn << PAGE.SHIFT J. Slabý (ITI) PB173/01 26. 10. 2010 9/1 Úkol Práce s virtuální adresou O linux/mm.h Q Naalokujte Stránku (virt=__get_f ree_page (GFP_KERNEL)) O Nakopírujte do ní řetězec O Zjistěte fyzickou adresu (phys=virt_to_phys (virt)) O Zjistěte adresu Struct page (page=virt_to_page (virt)) O Zarezervujte Stránku (SetPageReserved (page)) O Přemapujte fyzickou stránku (map=ioremap (phys, ...)) O Vypište virt, phys, page, map a page_to_pf n (page) O Vypište obsah (%s) virt a map Q Změňte obsah map a vypište obsah virt (D iounmap, ClearPageReserved a free.page © Zkonzultujte S Documentation/x86/x86_64/mm. txt J. Slabý (ITI) PB173/01 26. 10. 2010 10/1 Alokace paměti Základní typy alokací • Malé bloky až souvisle po stránkách (kmailoc) • Souvisle po Stránkách (__get_f ree_pages) a Nesouvisle po stránkách a namapovat (vmailoc) GFP_* • Parametr pro alokátory • gfp_atomic - nespi (např. uvnitř spinlocků) • gfp.temporary - uvolním během pár příštích instrukcí • gfp_kernel - obyčejné alokace všude jinde « a další: gfp_nofs, gfp_noio, ... J. Slabý (ITI) PB173/01 26. 10. 2010 11 /1 kmalloc • linux/slab.h • Až cca. 8M (různí se pro architektury) • Využívá 2. typ alokátorů, ale rozděluje stránky na menší kusy • kmalloc, kzalloc, kfree • Různé implementace: SLAB, SLUB, SLOB, SLQB J. Slabý (ITI) PB173/01 26. 10. 2010 12/1 __get_f ree_pages • linux/mm.h • Stránka má velikost page.size (x86: 4K) • Velikost alokace se udává řádem, order (2order = počet stránek) • get-order, MAX_ORDER (na x86 =11= 8M) • Musí najít souvislý blok volných stránek o Může být problém najít větší bloky (řádu >= 2) kvůli fragmentaci • Používá tzv. buddy systém • Snižuje fragmentaci • Podrobnosti viz wiki • Rychlejší než kmailoc a __get_f ree.pages, f ree.pages • __get_free.page, free_page J. Slabý (ITI) PB173/01 26. 10. 2010 13/1 vmalloc • linux/vmalloc. h • Podobný kmalloc • Neatomický (nemá gfp_*) • Maximální velikost daná omezením architektury • x86: 128M (lze zvýšit parametrem, ne o moc) • x86_64: 30T • Alokuje po stránkách a mapuje je souvisle • Tj. používá 2. alokátor • Fyzické stránky jsou umístěné různě po RAM • Dražší • vmalloc, vf ree • Odlišná práce s adresami • vmalloc_to_page, vmalloc_to_pfn J. Slabý (ITI) PB173/01 26. 10. 2010 14/1 Poznámky na závěr • Vše, co může číst uživatel se musí nejprve vymazat • kzalloc, get_zeroed_page, __gfp_zero, vzalloc • Nejlépe vymazat všechno, co alokuji a není kritické • Používat správné gfp_* • gfp_atomic funguje všude, ale ubírá vzácné prostředky J. Slabý (ITI) PB173/01 26. 10. 2010 15/1 Úkol Alokace paměti O Zjistěte, kolikrát za sebou lze naalokovat pamět: • řádu 10 jako gfp_atomic • řádu 10 jako gfp_atomic (znovu po 5 vteřinách) • řádu 10 jako gfp_kernel • řádu 10 jako gfp_kernel po uvolnění předešlé paměti • Pozn.: 210 • 4096 — 4 M, jak velké pole na ukazatele? O Zkuste ve smyčce alokovat paměť s řádem < page_alloc_costly_order, co se stane? Přijde OOM killer... Demo: pb173/05 J. Slabý (ITI) PB173/01 26. 10. 2010 16/1