2011-12-12 26 views
7

Linux è il sistema operativo e ARM è il processore indicato in questo contesto.Memoria del kernel (voci dell'indirizzo virtuale) in TLB?

Il TLB contiene sia indirizzi virtuali del kernel sia spazi utente? La memoria del kernel inizia da 0xc000_0000 e va a 0xFFFF_FFFF dove i primi 3 GB appartengono allo spazio utente. Tra il cambio di contesto tra i processi, il TLB viene svuotato.

Il TLB contiene sia indirizzi virtuali del kernel sia spazi utente?

La memoria del kernel (virtuale) corrisponde direttamente alla memoria fisica (la sola compensazione con 0xC000_0000 ci fornirà l'indirizzo fisico). È necessario avere memoria del kernel (virtuale) in TLB (se si dice che è presente in TLB)? Dovrebbe avere solo l'indirizzo dello spazio utente presente.

risposta

7

Il motivo principale per cui abbiamo virtuale per la conversione degli indirizzi fisico a CPU moderna è quello di fare un uso più efficiente e meglio controllati della memoria che ci permette di:

  1. alloca alcuna memoria fisica, RAM, (contigua o non) e renderlo accessibile ovunque nello spazio degli indirizzi virtuali (in modo contiguo o meno), senza sprecare memoria nella frammentazione.
  2. Estendi la memoria fisica, la RAM, con il disco o altri ricordi.
  3. Trasforma alcune parti dello spazio indirizzo solo leggibili o non eseguibili o solo per il kernel, ecc. Ecc. E proteggetele da accessi non autorizzati o errati.
  4. Isolare le memorie delle applicazioni l'una dall'altra per migliorare ulteriormente la protezione, la sicurezza e l'affidabilità.
  5. Memoria condivisa. ...

E le tabelle di pagina rendono tutto questo possibile.

Si desidera essere in grado di mappare e rimuovere la memoria fisica nello spazio degli indirizzi virtuali nel kernel e in genere questo meccanismo di traduzione funziona nell'intero sistema. Ovviamente, la traduzione ha un prezzo poiché ora è necessario consultare e mantenere le tabelle delle pagine e questo comporta un calo di prestazioni. Ma non tutto è perduto:

  1. I TLB alleviano questo problema in una certa misura. Memorizzano nella cache le traduzioni.
  2. Pagine più grandi (ad esempio ARMv7-A 's large pages e sections) aiutano di più poiché hanno bisogno di un minor numero di voci TLB per unità della memoria tradotta.
  3. Ci sono anche cose come global pages. Quando si passa da un'applicazione all'altra e si necessita di svuotare il TLB corrente, è possibile evitare di invalidare le pagine globali dal TLB eseguendo Invalidate TLB entries by ASID match con l'applicazione ASID. Se contrassegni le pagine del kernel come globali, non invalidi le loro traduzioni e il kernel stesso non subisce invalidazioni TLB non necessarie.

Vedi, per esempio, "ARM® Architettura Manuale di riferimento ARM®v7-A e ARM®v7-R edition" per i dettagli specifici relativi al braccio Virtual Memory System Architecture (VMSA), tabelle di pagina, TLB, etc.

5

Ci sono due tipi di indirizzi virtuali che il kernel Linux usa:

  1. quello che già citato nella linea "di memoria del kernel (virtuale) direttamente corrisponde alla memoria fisica (solo compensazione con 0xC000_0000 sarà give noi indirizzo fisico) ". Questo programma per indirizzi fisici contigui.
  2. Utilizzo di vmalloc.

La prima avviene tramite una MACRO:

include/asm-x86/page_32.h 

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) 
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 

_PA (x) fa il virtuale alla traduzione fisico. Si prega di notare che questa traduzione avviene in linea in fase di compilazione. Non avviene alcuna traduzione della tabella di pagina. Quest'ultima frase è molto importante.

D'altra parte, utilizzando il secondo metodo è possibile allocare memoria che è contigua nella memoria virtuale, ma potrebbe non esserlo nella memoria fisica. Ora, in questo caso è necessaria la traduzione della tabella a pagina intera quando si accede a un indirizzo virtuale per la prima volta. La domanda è: chi fa questo?

Nel caso di macchine CISC (come x86), la MMU (hardware) esegue tale operazione in caso di mancata connessione TLB (accesso per la prima volta a indirizzo virtuale) e aggiorna la tabella delle pagine. Per gli indirizzi virtuali del kernel (ottenuti tramite vmalloc) vengono mantenuti come voci TLB. Si chiamano voci globali e quando si verifica un cambio di contesto di processo, vengono per lo più ignorati e non svuotati come il resto delle voci dello spazio di indirizzamento del processo. Tuttavia, quando si esegue un vfree per rilasciare la memoria virtuale associata, tali voci vengono eliminate.

In caso di una macchina RISC (come MIPS), la traduzione della pagina viene gestita dal software. Dopo un errore TLB, l'hardware genera un'eccezione. Un handle trap viene eseguito in modalità kernel per eseguire la traduzione e aggiorna il TLB utilizzando istruzioni speciali. Dopo essere ritornati dal gestore trap, viene eseguita la stessa riga di codice e si verifica un hit TLB.

prega di fare riferimento a: http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

La linea di fondo è che non tutti gli indirizzi del kernel sono mappati il ​​modo in cui hai descritto. Per il tuo caso, gli indirizzi fisici sono generati in fase di compilazione stessa. Quindi, perché aggiungere una voce TLB. Per gli indirizzi di vmalloc, sono presenti voci TLB. Quando il cambio di contesto avviene tra processi, l'intero TLB non deve essere svuotato e le voci globali create dal vmalloc del kernel possono essere preservate. Quando si utilizza vfree, le voci globali corrispondenti vengono svuotate.

+0

ARM è una macchina RISC e suppongo che sia eseguita nello stesso modo descritto per MIPS. Non sono sicuro però. Tuttavia, ritengo che la tua domanda possa essere sufficientemente risolta senza tenere conto dell'architettura del processore. – trans1st0r

+0

Sembra che [ARM esegua la pagina dell'hardware] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/I1029222.html). Oltre all'evidente vantaggio di un overhead più basso per una mancata TLB, questo consente il prefetch TLB speculativo, che non è realmente fattibile con la gestione del software TLB-miss. Anche http://stackoverflow.com/questions/28019266/arm-mmu-and-arm-linux-page-table-walk. Il documento ARM che ho trovato menzionava qualcosa sulla disabilitazione di un bit di page-walk, quindi forse ARM può usare le passeggiate con la pagina del software, a differenza di x86. –