La memoria virtuale del SO è gestita tramite paginazione, e come nei processi normali i suoi indirizzi virtuali sono tradotti in indirizzi fisici da MMU.
Tuttavia il SO è anche il gestore della memoria fisica, e le sue tabelle delle pagine hanno dimensioni molto grandi. Pertanto esso è dipendente dalla MMU.
L'architettura x64
ha uno spazio di indirizzamento potenziale di
Lo spazio di indirizzamento è diviso in due sottospazio di modo U e S ambedue da
Area | Costanti simboliche | Indirizzo iniziale | Dimensione |
---|---|---|---|
Unused space | |||
Mappatura memoria fisica | PAGE_OFFSET |
||
Unused space | |||
Memoria dinamica del kernel | VMALLOC_START |
||
Unused space | |||
Mappatura memoria virtuale | VMEMMAP_START |
||
Unused space | |||
Codice e dati del SO | _START_KERNEL_MAP |
||
Area per caricare dinamicamente i moduli | MODULES_VADDR |
Per utilizzare gli indirizzi fisici si dedica una parte dello spazio virtuale del SO alla mappatura uno ad uno della memoria fisica. L'indirizzo iniziale di tale area virtuale è definito dalla costante PAGE_OFFSET
.
Nel codice del SO esistono funzioni che eseguono la conversione tra indirizzi fisici e virtuali dell'area di rimappatura con gli opportuni controllo.
Per evitare inoltre di allocare una tabella così grande per ogni processo la tabella è organizzata ad albero su CR3
della CPU e viene caricato ogni volta che viene mandato in esecuzione un processo.
Le PTE delle tabelle attraversate non utilizzano i
Quando il processore deve accedere ad un indirizzo fisico in base a un indirizzo virtuale, deve attraversare tutta la gerarchia della tabella delle pagine per trovare la PTE. Questo processo è detto Page Walk e richiede 5 accessi a memoria per accedere ad una sola cella utile di memoria.
Per evitare questo inaccettabile numero di accessi x64
possiede il TLB, che contiene le corrispondenze NPV-NPF più utilizzate recentemente. Quando viene modificato il contenuto di cr3
la MMU invalida la TLB, escluse le righe marcate come globali, cioè condivise da più processi.
La MMU cerca autonomamente nella TP le PTE di pagine non presenti. Quando viene chiesto un indirizzo virtuale la MMU verifica se la pagina P richiesta è presente nel TLB. Se è presente la accede immediatamente. In caso contrario la MMU esegue il Page Walk per recuperare la PTE relativa alla pagina P, e se questa è valida il suo contenuto viene copiato nel TLB e viene acceduta. Se anche quest'ultima non è valida si verifica un page fault.
La gestione della paginazione è una funzione che dipende in grande misura dall'architettura hardware. Linux utilizza un modello parametrizzato per adattarsi alle diverse architetture. La tabella delle pagine è sempre residente in memoria fisica e mappa tutto lo spazio di indirizzamento del processo, user e kernel.
In x64
tutta la memoria è paginata, indipendentemente dal modo di funzionamento della CPU, quindi anche il SO e la stessa tabella delle pagine sono paginati. All'avviamento del sistema la tabella delle pagine non è ancora inizializzata, e quindi deve esistere un meccanismo di avviamento che permetta di arrivare a caricare tale tabella per far partire il sistema.
Non esiste una TP del SO, ma solamente quella dei processi e quindi il SO viene mappato dalla TP in ogni processo. Lo spazio virtuale è suddiviso esattamente a metà tra modo U e modo S. Questo fatto non genera ridondanza, perché tutte le metà superiori delle TP di ogni processo puntano alla stessa struttura di sottodirectory relativi al SO.
Nell'area virtuale del kernel una parte è utilizzata per la mappatura della memoria fisica, che consente al SO di accedere direttamente a indirizzi fisici. La dimensione effettivamente mappata è determinata dalla dimensione effettiva della memoria fisica. Il rapporto tra la dimensione della porzione di tabella delle pagine interessata e la dimensione della memoria fisica tende a