PB173 - Ovladače jádra - Linux V. Paměť Jiri Slabý Fakulta informatiky Masarykova univerzita 14. 10. 2014 Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 1/20 Obsah cvičení Q Organizace paměti • Fyzický prostor • Virtuální prostor Alokace paměti • SLAB alokátor a Stránkový alokátor • Virtuální alokátor Jiri Slabý (Fakulta informatiky, MU) 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/02 14.10.2014 3/20 Sekce 1 Organizace paměti Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 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:dmesglgrep BI0S-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 • Nutná podpora HW (MMU), jinak mapování 1:1 Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 5/20 Organizace paměti - graficky Userspace (differs per process) Hole Physical memory Hole Kernel Modules Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 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 ioo-i8f -> řadič klávesnice • 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é) Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 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 nežRSDP) • Zapamatovat si adresu (Oxooooooooaf5bOioo) Q Získat virtuální adresu (u32 *virt = ioremap_cache(phys, 8)) O Vypsat virtuální adresu (7„p a porovnat hodnotu s fyzickou) O Vypsat signaturu (4 B textu - virt [0]) Q Vypsat délku tabulky (4 B - virt [1]) 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/02 14.10.2014 8/20 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) 9 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/02 14.10.2014 9/20 Grafické shrnutí Main Memory Physical addresses IOMMU Device add 'esses Device Zdroj: wikipedia Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 10/20 Operace s adresami • linux/mm.h, linux/io.h a Např. void *virt =__get_f ree_page Fyzická adresa • phys_addr_t phys = virt_to_phys(virt) a 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)) a 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/02 14.10.2014 11/20 Ú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)) 0 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_pf n(page) O Vypište obsah (°/„s) virt a map © Změňte obsah map a vypište obsah virt O iounmap, ClearPageReserved a free_page O Zkonzultujte S Documentation/x86/x86_64/mm.txt Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 12/20 Sekce 2 Alokace paměti Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 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_* a Parametr pro alokátory • gfp_atomic - nespi (např. uvnitř spinlocků) • gfp_temporary - uvolním během pár příštích instrukcí o gfpjíernel - obyčejné alokace všude jinde • a další: gfp_nofs, gfp_noio, ... Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 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), kf ree Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 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/02 14.10.2014 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 (řádu >= 2) kvůli fragmentaci • Rychlejší než kmalloc • 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= 8M) O__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/02 14.10.2014 17/20 vmalloc Virtuální alokátor • Použitím podobný kmailoc • Neatomický (vnitřně používá gfpjíernel) • 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žší • 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/02 14.10.2014 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_* o gfp_atomic funguje všude, ale ubírá vzácné prostředky Jiri Slabý (Fakulta informatiky, MU) PB173/02 14.10.2014 19/20 Úkol Alokace paměti O Zjistěte, kolikrát za sebou lze naalokovat pamět: • řádu 10 jako gfp_atomic o řá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 o 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/02 14.10.2014 20/20