La virtualizzazione dei sistemi operativi – Appendice

In precedenza abbiamo descritto le tecniche di virtualizzazione e di allocazione della CPU. In questa appendice cerco di analizzare e di riassumere con un diagramma di flusso la modalità di esecuzione di un blocco di istruzioni che la macchina virtuale esegue sulla propria Virtual CPU e come queste vengono elaborate dal virtual machine monitor ed eseguite sulla CPU fisica.


Fig. A.1: L’isomorfismo tra lo stato della macchina virtuale e la macchina fisica.

La figura 1 illustra in un grafico l’isomorfismo che si crea tra lo stato della CPU della macchina virtuale guest e lo stato della CPU della macchina fisica host. Ogni stato Si della macchina guest è rappresentabile in uno stato S’i della macchina host attraverso una funzione V(Si). Analogamente per ogni operazione e(Si) che porta lo stato della CPU virtuale in Sj esiste una operazione e’(S’i) che porta lo stato della CPU fisica in S’j. Il virtual machine monitor deve implementare le funzioni v(x) e e(x).

Nel caso della direct execution la funzione v(x) non modifica lo stato della CPU fisica, ma può capitare che il sistema sollevi una trap. In questo caso il VMM “riprende” l’istruzione e la emula. In altre situazioni istruzioni eseguite dal sistema operativo guest de-privilegiato non sollevano trap. In questo caso bisogna operare la Binary Translation (BT).

Di seguito ho cercato di riassumere in un diagramma di flusso l’analisi dell’istruzione che il VMM esegue sulle istruzioni presentate dalla macchina virtuale:

Fig. A.2: Diagramma di flusso dell’esecuzione delle istruzioni da CPU Virtuale a Fisica.

Il VMM ispeziona il basic block1 e ogni istruzione viene copiata in una translation cache. Ciascuna istruzione viene poi tradotta. Se questa non necessita di modifiche può essere eseguita senza modifica sulla CPU fisica. Altre istruzioni “pericolose” subiscono invece una traduzione. Piccole traduzioni che vengono definite “INDENT Translations” vengono effettuate le modifiche opportune e inviate alla translation cache. Se invece sono necessarie traduzione più consistenti vengono eseguite delle chiamate dal VMM emulare l’istruzione. Vediamo un esempio sul seguente blocco di codice Assembly.

Nella figura successiva sono riportate le istruzione per la gestione di un interrupt sollevato nella macchina virtuale.


Fig. A.3: Evoluzione delle istruzioni tra la CPU virtuale e fisica nella gestione di un interrupt.

Si vede che le istruzioni che non comportano particolari problemi, ad esempio la mov ebx,eax vengono eseguite direttamente, mentre una stessa mov ebx, cr3 è gestita dato che non è possibile accedere al registro CR3 da ring diversi da 0. L’hypervisor dovrà quindi effettuare una chiamata alla procedura di gestione del registro CR3.

Torna all’Indice »

1Generalmente per basic block si intende un blocco di codice che non contiene istruzioni di salto o return.

Notizie: abbiamo molto da raccontare