PB173 - Ovladače jádra - Linux V. Paměť Jiri Slabý ITI, Fakulta informatiky 15. 10. 2013 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, Fl) PB173/02 15. 10. 2013 2/ 19 Část I Organizace paměti J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 3/ 19 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) • X86: dmesg|grep BIDS-e820 Virtuální prostor (paměť) a Rozložení si určuje OS • Různé na každé architektuře • Dané mapování mezi FP a VP a Nutná podpora HW (MMU), jinak mapování 1:1 J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 4/ 19 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 je za MMU • RAM, časovače, řadiče přerušení, ACPI tabulky, zařízení • Co kde je => otázka na BIOS/(U)EFI/... « Jak který prostor vypadá => specifikace bridge, ACPI, PCI, ... • I hierarchický prostor • Např. rozsah 100-lf f ->• ChipXY 0 ChipXY směruje dále: • Adresa ioo-i8f -> řadič klávesnice o Adresa 190-if f -> č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, Fl) PB173/02 15. 10. 2013 6/ 19 Ú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: xsdt 00000000af5b0100 00064 • Jeden si zvolit (kromě rsdp) • Zapamatovat adresu (Oxooooooooaf5bOioo) Q Získat virtuální adresu (u32 *virt = ioremap_cache(pliys, 8)) O 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 (tj. 0x00064 nahoře) 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, Fl) PB173/02 15. 10. 2013 7/ 19 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 • Index stránky je tzv. page frame number (pfn) • OS namapuje stránky do VP • A může přidat „imaginární" stránky např. na disku (swap) • Programy vidí více „paměti" • Toto mapování čte MMU (ví odkud) • Každá stránka má svoji struct page • Informace o stránce (nikdy nevyswapovat, špinavá, počet uživatelů) J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 8/ 19 Operace s adresami • linux/mm.h, linux/io.h • Např. void *virt =__get_free_page Fyzická adresa • phys_addr_t phys = virt_to_phys(virt) • void *virt = phys_to_virt(phys) Struktura page • struct page *page = virt_to_page(virt) • void *virt = page_to_virt(page) PFN • unsigned long pfn = page_to_pfn(virt_to_page(virt)) • void *virt = pfn_to_virt(pfn) • unsigned long pfn = phys » PAGE_SHIFT a phys_addr_t phys = pfn « PAGE_SHIFT J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 10/19 Úkol Práce s virtuální adresou O linux/mm.h O Naalokujte Stránku (virt = __get_free_page(GFP_KERNEL)) 0 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, ...)) a Varování v dmesg ignorujte O Vypište virt, phys, page, map a page_to_pfn(page) O Vypište obsah (%s) virt a map <£> Změňte obsah map a vypište obsah virt Q iounmap, ClearPageReserved a free_page © Zkonzultujte S Documentation/x86/x86_64/mm.txt J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 11/19 Část II Alokace paměti J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 12/19 Alokace paměti Základní typy alokací • Malé bloky až souvisle po stránkách (kmailoc) a Souvisle po stránkách (__get_free_pages) • Nesouvisle po stránkách a namapovat (vmailoc) GFP_* • Parametr pro alokátory • gfp_atomic - nespi (např. uvnitř spinlocků) • gfp_tempdrary - 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, Fl) PB173/02 15. 10. 2013 13/19 kmalloc SLAB alokátor • Vnitřně alokuje po stránkách • Stránka má velikost page_size (x86: 4K) • Rozděluje stránky na menší kusy • Vyhýbá se fragmentaci paměti • linux/slab.h • kmalloc, kzalloc (= kmalloc + memset), kfree J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 14/19 Úkol Alokace pomocí kmailoc O Alokujte 32 stránek (jednou alokací) Q Vypište jejich pfn Skákejte po page_size Použijte virt_to_page a page_to_pf n o o J. Slabý (ITI, Fl) get_free_pages Stránkový alokátor • 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 • Rychlejší než kmalloc • Používá tzv. buddy systém • Snižuje fragmentaci • Podrobnosti viz wiki • linux/mm.h • Velikost alokace se udává řádem, order (2order = počet stránek) • get_order, MAX_ORDER (na x86 =11= 8M) •__get_free_pages, free_pages •__get_free_page, free_page (order 0) Úkol: alokace 32 stránek a výpis pfn J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 16/19 vmalloc Virtuální alokátor • Použitím podobný kmailoc « Neatomický (vnitřně používá gfp_kernel) • Maximální velikost alokace daná omezením architektury • x86: 128MÍB (lze zvýšit parametrem, ne o moc) • x86_64: 30 Ti B • Alokuje po stránkách a mapuje je souvisle • Fyzické stránky jsou umístěné různě po RAM • Dražší a linux/vmalloc.h • vmalloc, vfree a Odlišná práce s adresami (POZOR) • vmalloc_to_page, vmalloc_to_pfn Úkol: alokace 32 stránek a výpis pfn J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 17/19 Poznámky na závěr • Vše, co může číst uživatel se musí nejprve vymazat • kzalloc, get_zeroed_page, vzalloc • Nejlépe vymazat všechno, co alokuji a není kritické a Používat správné GFP_* • gfp_atomic funguje všude, ale ubírá vzácné prostředky J. Slabý (ITI, Fl) PB173/02 15. 10. 2013 18/19 Ú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 — 4M, 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, Fl) PB173/02 15. 10. 2013 19/19