Virtualizzazione x86

Ci sono dei problemi che non permettono di sfruttare al massimo i processori della famiglia x86 (Pentium, Core, Athlon…). Alcune istruzioni implementate nelle CPU non soddisfano appieno i requisiti di Popek e Goldberg (nella tradizionale architettura x86) e sono: SGDT, SIDT, SLDT, SMSW, PUSHF, POPF, LAR, LSL, VERR, VERW, POP, PUSH, CALL, JMP, INT n, RET, STR, MOVE.
Negli x86 le istruzioni privilegiate se sono eseguite con privilegi insufficienti (esempio hanno ring maggiore di zero) producono un’eccezione (trap) che può essere intercettata dal VMM (che sta nel ring 0) e essere amministrata.
Alcune istruzioni sensibili (ma non privilegiate) se eseguite senza privilegi sufficienti non generano trap ma sono ignorate cosicché il VMM non riesce ad intervenire e inoltre spesso provocano messaggi di errore e instabilità nel sistema.
Tuttavia l’enorme diffusione di computer x86 ha reso estremamente interessante la possibilità di usare la virtualizzazione nonostante i limiti della piattaforma.
Esempio:
CPL indica l’attuale livello di protezione di un segmento.
PUSH è un’istruzione sensibile non privilegiata; se viene applicata al CPL (ossia PUSH CPL), viene memorizzato il livello attuale di protezione del segmento in uso all’interno del registro nello stack. Se viene eseguita senza privilegi, il contenuto del registro non solo non viene cambiato ma neppure viene generata un’eccezione e l’operazione fallisce tacitamente. Tra l’altro il sistema operativo ospite può facilmente determinare che non sta lavorando in ring 0.
[ad#midarticlequadr]
Estensioni per la virtualizzazione
I più recenti processori x86 prodotti a partire dal 2006 beneficiano di un set di istruzioni per la virtualizzazione che permettono alla piattaforma di soddisfare pienamente i requisisti di Popek e Goldberg, rendendo non più necessaria l’interpretazione di alcune istruzioni non virtualizzabili.
Purtroppo Intel e AMD non hanno reso compatibili fra loro le estensioni, per ciò ogni software di virtualizzazione deve implementare entrambi i set.
Le estensioni di AMD si chiamano AMD-V, mentre quelle di Intel per i suoi processori x86 si chiamano VT. Intel VT-x rappresenta il sottoinsieme delle estensioni sviluppate per i processori.
Intel ha apportato alle CPU:

  • due nuovi livelli operazionali (protection level)
  • remapping DMA (Direct memory access)
  • TLB I/O

I nuovi livelli di protezione consentono al VMM di operare in uno stato operazionale detto modalità root, mentre i guest non modificati lavorano nello stato non-root mode.
Entrambe le due modalità supportano i quattro anelli della protected mode permettendo così ai software ospiti di operare al livello per cui sono stati scritti e attribuisce al VMM la flessibilità di poter usare più livelli di privilegio.
VT-x definisce anche due nuove transizioni:
dalla root mode alla non-root mode = VM entry
dalla non-root alla root = VM exit
Le transizioni sono gestite da una struttura dati chiamata virtual-machine control structure (VMCS).
Grazie a questa soluzione, ora, molte istruzioni e eventi generano delle VM exit. Il tentativo da parte di una macchina virtuale di eseguire un’operazione non autorizzata produce un’eccezione VM exit che restituisce il controllo al VMM.
Dunque non è più necessario che il software di virtualizzazione intercetti il flusso delle istruzioni, in quanto il VMCS ha controllo degli interrupt e delle eccezioni. Il VMM ha completo accesso alle informazioni riguardati gli eventi sincroni incluso il codice d’errore originato.
Anche il problema delle system call è risolto: il sistema guest è in esecuzione in ring 0 e ciò elimina il problema delle transizioni dal kernel al guest.

virtual machine

Articolo precedente

Server virtualization
virtual machine

Articolo successivo

Ebook VMware vSphere