PB173 - Ovladače jádra - Linux V. Paměť Jiri Slabý Fakulta informatiky Masarykova univerzita 29. 10. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 1 /20 Obsah cvičení 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 29.10.2015 2/20 Práce s pamětí LDD3 kap. 8 (zastaralá část o bootmem) Understanding the Linux Virtual Memory Manager (zastaralá) • Organizace paměti • Alokace paměti Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 3/20 Sekce 1 Organizace paměti Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 4/20 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:dmesg|grep BI0S-e820 Virtuální prostor (paměť) • Rozložení si určuje OS • Různé na každé architektuře • Dané mapování mezi FP a VP • Nutná podpora HW (MMU), jinak mapování 1:1 Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 5/20 Organizace paměti - graficky o cti Cito O co RAM ACPI Timer PCI devices Empty Userspace (differs per process) Hole Physical memory Hole Kernel Modules CO o CO Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 6/20 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 « ChipXY směruje dále: • Adresa 100-I8f řadič klávesnice • Adresa 190-lf 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é) Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 7/20 Ú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 OOOOOOOOaf 5b0100 00064 • Jeden si zvolit (jinou nezRSDP) • Zapamatovat si adresu (Oxooooooooaf 5bOioo) Q Získat virtuální adresu (u32 *virt = ioremap_cache(phys, 8)) Q Vypsat virtuální adresu (°/0p a porovnat hodnotu s fyzickou) O Vypsat signaturu (4 B textu - virt [0]) Q Vypsat délku tabulky (4 B-virt [l]) O Odmapovat (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 29. 10. 2015 8/20 Virtuální prostor • 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 29. 10. 2015 9/20 Grafické shrnutí RAM A A Physical addresses 1 IOMMU t Device addresses ■ ■ MMU Virtual addresses Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 10/20 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 (Page Frame Number) • unsigned long pfn = page_to_pfn(virt_to_page(virt)) • void *virt = pfn_to_virt(pfn) • unsigned long pfn = phys » PAGE_SHIFT • phys_addr_t phys = pfn « PAGE.SHIFT Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 11/20 Práce s virtuální adresou O linux/mm.h O Naalokujte Stránku (virt = __get_free_page(GFP_KERNEL)) Q Nakopírujte do ní řetězec O Zjistěte fyzickou adresu (phys = virt_to_phys(virt)) Q 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, ...)) • Varování v dmesg ignorujte O Vypište virt, phys, page, map a page_to_pfn(page) O Vypište obsah (°/0s) virt a map Q Změňte obsah map a vypište obsah virt O iounmap, ClearPageReserved a free.page O Zkonzultujte S Document at ion/x86/x86_64/mm. txt Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 12/20 Sekce 2 Alokace paměti Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 13/20 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_* • 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 29. 10. 2015 14/20 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 Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 15/20 Úkol Alokace pomocí kmailoc O Alokujte 32 stránek (jednou alokací) O Vypište jejich pfn • Skákejte po page.size • Použijte virt_to_page a page_to_pf n Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 16/20 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 29. 10. 2015 17/20 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 o x86: 128 MiB (lze zvýšit parametrem, ne o moc) • x86_64:30TiB • Alokuje po stránkách a mapuje je souvisle • Fyzické stránky jsou umístěné různě po RAM o 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 29. 10. 2015 18/20 Poznámky na závěr Vše, co může číst uživatel se musí nejprve vymazat • Pomocníci: kzalloc, get_zeroed_page, 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 Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 19/20 Ú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: pb 173/05 Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 10. 2015 20/20