2012-03-22 8 views
18

La mia comprensione è che le tabelle delle pagine shadow eliminano la necessità di emulare la memoria fisica all'interno della VM.Che cosa fanno esattamente le tabelle delle pagine shadow (per VMM)?

ie.

invece di: ospite os -> VMM + memoria fisica virtuale -> sistema operativo host -> hardware ospite

è solo: ospite os -> VMM -> sistema operativo host -> hardware ospite

Le tabelle delle pagine shadow consentono al processo di accedere correttamente alla memoria dell'hardware dell'host. Inoltre, non capisco come funzionino gli errori di pagina (o poiché tutta la memoria fisica è gestita dall'host, l'host si occupa degli errori di pagina, dello scambio, ecc.).

(per compiti a casa intendo che sto studiando per un test e dobbiamo capire questo concetto).

risposta

51

Le tabelle della pagina shadow vengono utilizzate dall'hypervisor per tenere traccia dello stato in cui l'ospite "pensa" che le tabelle delle pagine debbano essere. Al guest non può essere consentito l'accesso alle tabelle della pagina dell'hardware perché in questo caso avrebbe essenzialmente il controllo della macchina. Quindi, l'hypervisor mantiene le mappature "reali" (guest virtuale -> host fisico) nell'hardware quando l'ospite rilevante è in esecuzione, e mantiene una rappresentazione delle tabelle della pagina che l'ospite pensa che stia usando "nell'ombra" o in almeno è così che mi piace pensarci.

Si noti che questo evita il passaggio di conversione GVA-> GPA.

Per quanto riguarda errori di pagina vanno, non cambia nulla dal punto di vista dell'hardware (ricordate, l'hypervisor rende così le tabelle di pagina utilizzati dall'hardware contiene GVA-> mappature HPA), un errore di pagina sarà semplicemente generare un'eccezione e il reindirizzamento al gestore delle eccezioni appropriato. Tuttavia, quando si verifica un errore di pagina mentre una VM è in esecuzione, questa eccezione può essere "inoltrata" all'hypervisor, che può quindi gestirla in modo appropriato.

L'hypervisor deve creare queste tabelle di pagine shadow in quanto visualizza gli errori di pagina generati dall'ospite. Quando l'ospite scrive una mappatura in una delle sue tabelle di pagina, l'hypervisor non lo saprà subito, quindi le tabelle della pagina shadow non saranno immediatamente sincronizzate con ciò che l'ospite intende. Così l'hypervisor si costruire le tabelle di pagina ombra in, ad esempio, nel seguente modo:

  • Giudizi scrive una mappatura per VA 0xdeadbeef in esso delle page table (una locazione di memoria), ma ricordate, questa mappatura non è essere utilizzato dall'hardware.
  • Ospite accede 0xdeadbeef, che causa un errore di pagina perché le tabelle di pagina reale non sono stati aggiornati per aggiungere il mapping
  • colpa pagina viene trasmesso al Hypervisor
  • Hypervisor guarda le tabelle delle pagine ospiti e le comunicazioni sono diversi dalle tabelle delle pagine shadow, dice "hey, non ho ancora creato una mappatura reale per 0xdeadbeef"
  • Quindi aggiorna le tabelle delle pagine shadow e crea una corrispondente scheda 0xdeadbeef -> HPA per l'hardware da utilizzare.

Il caso precedente è chiamato una pagina un'ombra guasto perché è causata esclusivamente dalla introduzione di virtualizzazione memoria. Quindi la gestione dell'errore di pagina si interromperà all'hypervisor e il sistema operativo guest non avrà alcuna idea che si sia verificato.Si noti che il guest può anche generare veri e propri errori di pagina a causa di mappature che non ha ancora provato a creare, e l'hypervisor inoltrerà questi backup nell'ospite. Inoltre, renditi conto che l'intero processo implica che l'errore ogni pagina che si verifica durante l'esecuzione del guest deve causare un'uscita al VMM in modo che le tabelle delle pagine shadow possano essere mantenute fresche. Questo è costoso e uno dei motivi per cui è stato introdotto il supporto hardware per la virtualizzazione della memoria. (here è una rapida introduzione a nidificate, o le tabelle delle pagine estese)

Un buon riferimento per questo è this book

+2

non mi rendevo conto fino a poco fa che '0xdeadbeef' è una cosa al di là della mia classe OS. – DIMMSum

2

Quando l'ospite scrive una mappatura in una delle sue tabelle di pagina, l'hypervisor non sa subito, quindi le tabelle delle pagine shadow non saranno immediatamente "sincronizzate" con ciò che l'ospite intende.

Non proprio. Le tabelle delle pagine degli ospiti sono di sola lettura. Ogni volta che vi è un aggiornamento (ad es., Una nuova mappatura aggiunta) nella tabella della pagina ospite, intercetta l'hypervisor e l'hypervisor aggiorna la tabella della pagina shadow di conseguenza "in sincronia" con il guest.

Riferimenti:

Problemi correlati