Ci sono due tipi di indirizzi virtuali che il kernel Linux usa:
- 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.
- 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.
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
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. –