PB173 - Ovladače jádra - Linux V. Paměť Jiri Slabý Fakulta informatiky Masarykova univerzita 18. 10. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 1 /19 Obsah cvičení LDD3 kap. 8 (zastaralá část o bootmem) Understanding the Linux Virtual Memory Manager (zastaralá) Q Organizace paměti • Fyzický prostor • Virtuální prostor Q Alokace paměti • SLAB alokátor Stránkový alokátor • Virtuální alokátor Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 2/19 Sekce 1 Organizace paměti Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 3/19 Organizace paměti 2 oddělené světy (tentokrát z pohledu HW) tj- 2 různé adresové prostory Fyzický prostor • Rozložení určuje BIOS (popř. ekvivalenty - (U)EFI, Qemu) • x86: dmesglgrep BI0S-e820 Virtuální prostor (paměť) 9 Rozložení si určuje OS • Různé na každé architektuře • Dané mapování mezi FP a VP e Nutná podpora HW (MMU), jinak mapování 1:1 Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 4/19 Organizace paměti - graficky CD ü CÖ Q_ CO "čo o "(/) BIOS i i [ i RAM ACPI Timer PCI Devices Empty MMU Mapping Userspace (Differs per Process) Physical Memory (RAM, ...) Hole Kernel Code/Data Modules CD u o CD Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 5/19 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, ... 9 I hierarchický prostor • Např. rozsah ioo-lf f ->> ChipXY • ChipXY směruje dále: • Adresa 100-I8f řadič klávesnice • Adresa 190-if f -» časovač RAM o 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é) Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 6/19 Úkol Práce s fyzickou adresou - čtení signatury a délky ACPI tabulky z fyzické adresy Najděte fyzickou adresu nějaké ACPI tabulky v dmesg • Řádky formátu acpi: xsdt 00000000af5b0100 00064 • Jeden si zvolte (jinou než rsdp) • Zapamatujte si adresu (Oxooooooooaf 5bOioo) • Datový typ pro fyzickou adresu je phys_addr_t Q Získejte virtuální adresu (u32 *virt = ioremap_cache(phys, 8)) O Vypište virtuální adresu (°/0p a porovnejte hodnotu s fyzickou) O Vypište signaturu (4 B textu - virt [0] a °/0.4s) O Vypište délku tabulky (4 B - virt [l] a °/0u) O Odmapujte (iounmap(virt)) O 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ší Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 7/19 Virtuální prostor o To, co vidí CPU (a překládá MMU) • 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ů) Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 8/19 Grafické shrnutí RAM Physical addresses lOMMU v. Device addresses MMU Virtual addresses CPU (program) Jiri Slabý (Fakulta informatiky, MU) PB 173/04 18. 10. 2016 9/19 Operace s adresami • linux/mm.h, linux/io.h • Např. void *virt =__get_f ree_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) 9 void *virt = page_to_virt(page) PFN (Page Frame Number) • unsigned long pfn = page_to_pfn(virt_to_page(virt)) • void *virt = pfn_to_virt(pfn) 9 unsigned long pfn = phys >> PAGE_SHIFT • phys_addr_t phys = pfn « PAGE.SHIFT Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 10/19 Úkol Práce s virtuální adresou O linux/mm.h Q Naalokujte Stránku (virt = __get_free_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)) 0 Zarezervujte Stránku (SetPageReserved(page)) O Přemapujte fyzickou Stránku (map = ioremap(phys, ...)) • Varování v dmesg ignorujte 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 O iounmap, ClearPageReserved a free_page © Zkonzultujte S Document at ion/x86/x86_64/mm. txt Jiri Slabý (Fakulta informatiky, MU) PB173/04 18.10.2016 11 /19 Sekce 2 Alokace paměti Jiri Slabý (Fakulta informatiky MU) PB173/04 18. 10. 2016 12/19 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) • Nesouvisle po stránkách a namapovat (vmailoc) GFP_* o 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, ... Jiri Slabý (Fakulta informatiky, MU) PB173/04 18.10.2016 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), kf ree Jiri Slabý (Fakulta informatiky, MU) PB173/04 18. 10. 2016 14/19 Úkol Alokace pomocí kmailoc O Alokujte 32 stránek (jednou alokací) O Vypište jejich pfn o Skákejte po page_size • Použijte virt_to_page a page_to_pf n Jiri Slabý (Fakulta informatiky MU) PB173/04 18.10.2016 15/19 get_free_pages Stránkový alokátor • Musí najít souvislý blok volných stránek • Může být problém najít větší bloky (> 4 stránky) kvůli fragmentaci • Rychlejší než kmailoc • Používá tzv. buddy systém • Snižuje fragmentaci • Podrobnosti viz wiki nebo Překladače • linux/mm.h • Velikost alokace se udává řádem, order (2order = počet stránek) • get_order, MAX_ORDER (na x86: 11, tj. 211 • 4k = 8M) •__get_free_pages, free_pages •__get_f ree_page, f ree_page (zkratky pro řád 0) Úkol: alokace 32 stránek a výpis pfn Jiri Slabý (Fakulta informatiky MU) PB173/04 18. 10. 2016 16/19 vmalloc Virtuální alokátor • Použitím podobný kmailoc • POZOR: neatomický (vnitřně používá gfp.kernel) • Maximální velikost alokace daná omezením architektury x86_32: 128 MiB (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žší • linux/vmalloc.h • vmalloc, vfree • Odlišná práce s adresami (POZOR) • vmalloc_to_page, vmalloc_to_pfn Úkol: alokace 32 stránek a výpis pfn Jiri Slabý (Fakulta informatiky, MU) PB173/04 18.10.2016 17/19 Poznámky na závěr Vše, co může číst uživatel se musí nejprve vymazat 9 Pomocníci: kzalloc, get_zeroed_page, vzalloc 9 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 Jiri Slabý (Fakulta informatiky MU) PB173/04 18. 10. 2016 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... Inspirace: pb173/05 Jiri Slabý (Fakulta informatiky MU) PB173/04 18. 10. 2016 19/19