Linux Memory mapping | Cerca per titolo, autore, parola chiave | ||||||||
Linux Memory mapping Linux Kernel Teaching, a cura di Daniel Băluță (Daniel), Răzvan Deaconescu (Răzvan, RD), Claudiu Ghioc (Claudiu), Valentin Ghiță (Vali), Sergiu Weisz (Sergiu), Octavian Purdilă (Tavi), Iulian Mateșică (Iulian), Alexandra Militaru (Alex), Teodora Șerbănescu (Teo), Ștefan Teodorescu (Ștefan, Fane), Mihai Popescu (Mihai, Mișu). Letture basate sul corso Operatings Systems 2 del Computer Science and Engineering Department, Faculty of Automatic Control and Computers, University POLITEHNICA of Bucharest. Obiettivi di questa sessione: comprendere i meccanismi della mappatura (mapping) dello spazio degli indirizzi: address space mmap() struct page struct vm_area_struct struct vm_struct remap_pfn_range SetPageReserved() ClearPageReserved() L'unità di base per la gestione della memoria virtuale è la pagina (page), che può avere dimensioni di 4K (normalmente), ma può anche essere di 64K, su alcune piattaforme. Quando si parla di memoria virtuale, si hanno due tipi di indirizzi: indirizzo virtuale e indirizzo fisico. Tutti gli accessi della CPU (inclusi quelli dello spazio del kernel) utilizzano gli indirizzi virtuali, che vengono tradotti, dalla MMU (Memory Management Unit, una classe di componenti hardware) in indirizzi fisici, con l'aiuto delle tabelle delle pagine (page tables). Una pagina di memoria fisica è identificata dal numero della Page Frame (Page Frame Number, o PFN). Il PFN può essere calcolato facilmente dall'indirizzo fisico, dividendo l'indirizzo fisico con le dimensioni della pagina, oppure eseguendo uno shift sull'indirizzo fisico di PAGE_SHIFT bit verso destra. Per motivi di efficienza, lo spazio degli indirizzi virtuali è diviso tra user space e kernel space. Per lo stesso motivo, lo spazio del kernel contiene una zona mappata di memoria, chiamata lowmem, mappata ad un'area di memoria fisica contigua, posta a partire dall'indirizzo più basso, normalmente dall'indirizzo 0. L'indirizzo virtuale dove è mappata lowmem è definito da PAGE_OFFSET.
In un sistema a 32 bit, non tutta la memoria disponibile può essere mappata in lowmem: per questo motivo, c'è un'area separata nello spazio del kernel, chiamata highmem, che può essere usata per mappare arbitrariamente la memoria fisica. La memoria allocata con: kmalloc() risiede in lowmem ed è fisicamente contigua, mentre la memoria allocata con: vmalloc() non è contigua e non risiede in lowmem, ma ha una zona dedicata in highmem. Structures used for memory mapping Prima di parlare dei meccanismi di mappatura della memoria per le periferiche, vediamo alcune strutture di base usate dal Linux memory management subsystem, quali: struct page struct vm_area_struct struct mm_struct
|
|||||||||
Linux Memory mapping | Disclaimer: questo è un link a contenuti ospitati su server esterni. |