2014-09-24 18 views
6

Ho una domanda sulla relazione tra kernel Linux e MMU. Ora ho capito che il kernel linux gestisce la tabella delle pagine tra gli indirizzi di memoria virtuale e gli indirizzi di memoria fisica. Allo stesso tempo c'è MMU nell'architettura x86 che gestisce la tabella delle pagine tra gli indirizzi di memoria virtuale e gli indirizzi di memoria fisica. Se MMU presenta vicino alla CPU, il kernel deve ancora occuparsi della tabella delle pagine?Gestione tabelle di pagine Linux e MMU

Questa domanda può essere stupida, ma l'altra domanda è, se MMU si occupa dello spazio della memoria, chi gestisce memoria alta e memoria bassa? Credo che il kernel riceverà la dimensione della memoria virtuale da MMU (4 GB a 32 bit), quindi il kernel distinguerà tra spazio utente e spazio del kernel in indirizzo virtuale. Sono corretto? o completamente sbagliato?

Grazie mille in anticipo!

+0

Linux può funzionare su hardware senza MMU, quindi il kernel deve sapere come eseguire la traduzione, ma su x86, credo, si usa semplicemente MMU per questo. –

+0

I secondo al commento di Gennadi. Nell'architettura x86, MMU si occupa di tradurre gli indirizzi virtuali in indirizzi fisici, ma il kernel manterrà comunque traccia di quali pagine appartengono al kernel e quali pagine appartengono ai processi dell'utente. Credo che [questo] (http://www.tldp.org/LDP/tlk/mm/memory.html) possa aiutare a far luce su come funzionano le cose. –

risposta

5

Le responsabilità di gestione delle pagine OS e MMU sono due facce dello stesso meccanismo, che vive al confine tra architettura e microarchitettura.

La prima parte definisce il "contratto" tra l'hardware e il software che viene eseguito su di esso (in questo caso, il sistema operativo). Se si desidera utilizzare la memoria virtuale, è necessario creare e gestire una tabella di pagine come descritto in quel contratto. Il lato MMU, d'altra parte, è un'unità hardware responsabile dell'esecuzione delle attività HW della conversione degli indirizzi. Questo può includere o meno le ottimizzazioni dell'hardware, queste sono solitamente nascoste e possono essere implementate in vari modi per funzionare sotto il cofano, purché mantenga il lato hardware del contratto.

In teoria, la MMU può decidere di emettere un set di accessi alla memoria per ogni traduzione (una pagina di marcia), al fine di ottenere il comportamento richiesto. Tuttavia, poiché si tratta di un elemento critico per le prestazioni, la maggior parte delle MMU ottimizza questo memorizzando nella cache i risultati delle passate precedenti all'interno del TLB, proprio come una cache memorizza i risultati degli accessi precedenti (in realtà, su alcune implementazioni, le cache stesse possono anche archiviare alcune gli accessi alla tabella delle pagine poiché solitamente risiede nella memoria memorizzabile nella cache). La MMU può gestire più TLB (la maggior parte delle implementazioni separa quelli per le pagine di dati e codici e alcuni hanno TLB di secondo livello) e fornisce la traduzione da lì senza che tu te ne accorga, tranne per il tempo di accesso più veloce.

Va inoltre notato che l'hardware deve proteggere da molti casi d'angolo che possono danneggiare la coerenza di tale "caching" TLB delle traduzioni precedenti, ad esempio l'aliasing delle pagine o i rimappature durante l'uso. Su alcune macchine, i casi più cattivi richiedono anche un flusso di flusso enorme chiamato sparatoria TLB.

+1

In particolare, è più appropriato affrontare la parte della domanda sulla separazione del kernel e dello spazio utente. (I * think * Linux usa gli indirizzi negativi (globali) per lo spazio del kernel e per x86 questo richiede una pagina nella parte superiore della tabella di pagina gerarchica (per spazio di indirizzamento) la metà superiore (negativa) di cui i sottotitoli del kernel sono mappati. supporta una tabella di pagina globale separata, che è presumibilmente usata dal kernel di Linux.La tabella di hash hash di Power non è usata da Linux per la tabella principale, il più recente sistema di caching di voci di directory si adatta al formato di tabella principale di Linux. –