La virtualizzazione delle device di I/O

Scritto il 06/08/2010
 

La virtualizzazione dei sistemi operativi – Capitolo 3.2.3

Anziché emulare l’hardware esistente, come generalmente avviene nella full virtualization, Xen espone un insieme astratto di device. Questo permette di progettare un’interfaccia che soddisfa le esigenze di protezione e isolamento.

A questo scopo i dati sono trasferiti da e per i domain U attraverso Xen utilizzando in buffer circolare denominato I/O rings. Esso fornisce un meccanismo di comunicazione molto performante per trasferire le informazione dal buffer attraverso il sistema, permettendo a Xen di effettuare i necessari controlli (ad esempio se si eccedono le dimensioni della memoria riservata ad un Domain U).

Come accade per gli interrupt hardware, Xen si avvale di un meccanismo di consegna di eventi utilizzato per inviare notifiche asincrone ai domain U. Queste notifiche sono effettuate tramite l’aggiornamento di una bitmap di eventi in sospeso ed, eventualmente, con una chiamata a una procedura richiesta dal sistema operativo guest.

L’intervento dell’hypervisor è necessario per fornire una protezione aggiuntiva tra i sistemi operativi guest e le device di I/O. È quindi importante che il meccanismo di controllo del flusso di dati generi il minor overhead possibile.

La scelta per il design del meccanismo di I/O ha tenuto conto di due fattori: la gestione delle risorse e gli eventi di notifica. Relativamente alla gestione delle risorse, si è cercato di minimizzare il lavoro di demultiplazione dei dati destinati ad uno specifico Domain U che si verifica al ricevimento di un interrupt da parte di un device. Analogamente la scrittura dei dati sulla memoria del device è effettuata, quando possibile, direttamente dal Domain U per evitare interferenze. La protezione del buffer condiviso del device è gestito da Xen che regola l’accesso agli indirizzi occupati.


Fig. 3.10: Il meccanismo degli I/O Rings utilizzato per il trasferimento dati tra Xen e le macchine virtuali

La figura 3.10 mostra la struttura del buffer I/O rings. Si tratta di una coda circolare di descrittori istanziati da un domain U ma accessibili da Xen. I descrittori non contengono direttamente il dato, ma un suo collegamento. L’accesso a ciascun I/O ring è effettuato utilizzando il paradigma produttore/consumatore appoggiandosi a due puntatori. Un domain U inserisce una richiesta su un I/O ring e avanza il puntatore produttore e Xen. Allorché Xen rimuove la richiesta per gestirla, avanza il puntatore consumatore. Le risposte sono inserite nello stesso ring da Xen e prelevate dal sistema operativo guest. Non è importante che le richieste vengano processate in ordine. Il sistema operativo guest associa un identificatore univoco a ciascuna richiesta che Xen inserisce nella risposta. In questo modo Xen può riordinare le operazioni I/O nel rispetto delle sue politiche di ottimizzazione delle performance o delle priorità tra le diverse macchine virtuali.

Questa struttura è sufficientemente generica per supportare tipologie diverse di device I/O. Ad esempio, un insieme di richieste può alimentare il buffer con pacchetti di rete e le conseguenti risposte segnalano l’arrivo del pacchetto. Il riordinamento è utile, dato che permette di trattare le richieste disco all’interno di Xen con efficienza implementando la tecnica del zero-copy transfer.

La produzione delle richieste e delle risposte è stata separata. Nel caso della richiesta, un domain U può accodarne numerose prima di effettuare l’hypercall che allerta Xen. Nel caso della risposta, un domain U può differire la consegna delle notifica di Xen specificando una soglia nel numero delle risposte.

Serverlab