GNU/Linux >> Linux Esercitazione >  >> Linux

Come fa la CPU a sapere quale indirizzo fisico è mappato a quale indirizzo virtuale?

La MMU accede a una tabella che descrive come convertire gli indirizzi virtuali in indirizzi fisici. (Non ha bisogno di tradurre gli indirizzi fisici in indirizzi virtuali, e questo sarebbe impossibile in generale poiché è possibile accedere allo stesso indirizzo fisico tramite più indirizzi virtuali o può essere non mappato.) Il layout di questa tabella dipende dall'architettura della CPU, ma il principio generale è sempre lo stesso:c'è un registro CPU che contiene l'indirizzo fisico di una tabella, che contiene gli indirizzi fisici di ulteriori tabelle, e così via (da 2 a 4 livelli totali su architetture esistenti) fino a un livello di tabelle che contiene gli indirizzi fisici in cui si trovano i dati. Ad ogni livello, quale elemento della tabella usare è determinato da alcuni dei bit nell'indirizzo virtuale.

La MMU non conosce i processi del sistema operativo in quanto tali. Quando la CPU passa all'esecuzione di un processo diverso, ovvero quando si verifica un cambio di contesto, è compito del codice di cambio di contesto del sistema operativo aggiornare le tabelle MMU secondo necessità. In pratica, penso che tutti i sistemi Unix conservino una copia delle tabelle in memoria per ogni processo e aggiornino semplicemente il registro MMU in modo che punti alla tabella di livello superiore per il processo corrente.

In realtà c'è una parte della MMU che si occupa dei processi del sistema operativo:il TLB. La ricerca delle voci nella tabella MMU è piuttosto costosa poiché comporta più accessi alla memoria. Il TLB è una cache di queste ricerche. In un cambio di contesto, il sistema operativo deve invalidare il TLB (ovvero rimuovere tutte le voci della cache), poiché la mappatura sarà diversa per il nuovo processo. Molte architetture consentono al sistema operativo di inserire un indicatore in ogni voce della tabella MMU per dire "questa voce appartiene al processo N". Una voce TLB viene quindi saltata se il numero di processo che contiene non è il numero di processo corrente. Un registro della CPU contiene il numero di processo corrente e il codice di cambio di contesto lo aggiorna. Questo meccanismo significa che il TLB può contenere informazioni su più processi contemporaneamente, il che migliora le prestazioni quando si passa avanti e indietro tra questi processi. Poiché spesso sono disponibili meno bit per archiviare N rispetto a quelli necessari per archiviare tutti gli ID di processo del sistema operativo, N non è l'ID di processo, ma un numero generato dal sistema operativo per questo scopo e che cambia nel tempo, se viene utilizzato.


In Linux, il kernel mantiene una tabella di pagine a tre livelli (indipendentemente dalle capacità della CPU). Il livello superiore è la directory globale della pagina e ogni processo ha la propria directory, pgd in mm_struct . Pertanto, ogni processo può avere le proprie mappature, quindi l'indirizzo 12345 in processi diversi punta a indirizzi fisici diversi.

Le CPU non sono realmente consapevoli dei processi, ma tendono ad avere funzionalità per supportarli. Sulle CPU in stile x86, ci sono varie funzionalità relative alle attività, ma in realtà tendono a essere ignorate. Poiché la pianificazione dei processi è gestita dal kernel, può tenere traccia delle modifiche alla tabella delle pagine e aggiornare qualsiasi stato della CPU sia necessario per passare alla tabella delle pagine di un nuovo processo quando cambia attività. Su PC x86, ciò comporta l'aggiornamento del registro di controllo CR3 che punta alla directory della pagina.

Il capitolo sulla gestione delle tabelle delle pagine in Capire il gestore della memoria virtuale di Linux di Mel Gorman libro offre una buona panoramica.


Linux
  1. Linux:in che modo Oom Killer decide quale processo uccidere per primo?

  2. Come funziona il comando Tee?

  3. In che modo il comando Xdg-open sa quale applicazione utilizzare per aprire un file?

  4. Come ottenere informazioni sulla CPU virtuale/fisica in Oracle VM (XEN)

  5. Come trovare quale processo sta causando un elevato utilizzo della CPU

Come trovare l'indirizzo IP di una macchina virtuale KVM

Linux:come viene suddiviso uno spazio di indirizzi virtuali di processo a 64 bit in Linux?

Come utilizzare il comando which in Linux

Qual è la tabella dei processi Linux? In cosa consiste?

Come funziona il comando ps?

In che modo Linux mantiene il controllo della CPU su una macchina single-core?