
La mia attuale comprensione:
1) KVM
KVM (Kernel-based Virtual Machine) – è un hypervisor (VMM – Virtual Machine Manager) che funziona come modulo su un sistema operativo Linux. L'hypervisor è necessario per eseguire del software in un ambiente virtuale (non esistente) e per nascondere all'applicazione il reale hardware fisico su cui opera. L'hypervisor funge da «interfaccia» tra l'hardware fisico (host) e il sistema operativo virtuale (guest).
Poiché KVM è un modulo standard del kernel Linux, riceve dal kernel tutti i vantaggi necessari (gestione della memoria, scheduler, ecc.). Di conseguenza, tutti questi vantaggi vengono trasferiti anche ai guest (dato che i guest operano su un hypervisor che opera all'interno del kernel del sistema operativo Linux).
KVM è molto veloce, ma da solo non è sufficiente per avviare un sistema operativo virtuale, poiché richiede l'emulazione dell'I/O. Per l'I/O (processori, dischi, rete, video, PCI, USB, porte seriali, ecc.) KVM utilizza QEMU.
2) QEMU
QEMU (Quick Emulator) – è un emulatore di vari dispositivi che consente di eseguire sistemi operativi progettati per un'architettura su un'altra (ad esempio, ARM –> x86). Oltre al processore, QEMU emula anche diversi dispositivi periferici: schede di rete, HDD, schede video, PCI, USB, ecc.
Funziona così:
Le istruzioni/codice binario (ad esempio, ARM) vengono convertiti in codice intermedio indipendente dalla piattaforma tramite un convertitore TCG (Tiny Code Generator) e poi questo codice binario intermedio viene convertito in istruzioni/codice target (ad esempio, x86).
ARM –> codice_intermedio –> x86
In sostanza, è possibile eseguire macchine virtuali su QEMU su qualsiasi host, anche con modelli di processori più vecchi che non supportano Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Tuttavia, in tal caso, le prestazioni saranno piuttosto lente, poiché il codice binario eseguibile deve essere ricompilato al volo due volte, tramite TCG (TCG è un compilatore Just-in-Time).
Cioè, QEMU è davvero fantastico, ma funziona molto lentamente.
3) Anelli di protezione

Il codice binario software sui processori non opera così liberamente, ma si colloca a diversi livelli (anelli / Protection rings) con diverse autorizzazioni per l'accesso ai dati, dal livello più privilegiato (Ring 0) a quello più limitato e regolato (Ring 3).
Il sistema operativo (nucleo OS) funziona su Ring 0 (modalità kernel) e può fare qualsiasi cosa con i dati e i dispositivi. Le applicazioni utente operano a livello Ring 3 (modalità utente) e non possono fare tutto ciò che vogliono, ma devono invece richiedere l'accesso per eseguire determinate operazioni (in questo modo, le applicazioni utente hanno accesso solo ai propri dati e non possono 'intrufolarsi' nella 'sandbox' altrui). Ring 1 e 2 sono destinati all'uso dei driver.
Prima dell'invenzione di Intel VT-x / AMD SVM, gli hypervisor funzionavano su Ring 0, mentre gli ospiti operavano su Ring 1. Poiché Ring 1 non ha abbastanza privilegi per il corretto funzionamento dell'OS, ogni volta che c'era una chiamata privilegiata dal sistema ospite, l'hypervisor doveva modificare al volo questa chiamata ed eseguirla su Ring 0 (in un modo simile a come fa QEMU). Ovvero, il codice binario dell'ospite NO veniva eseguito direttamente sulla CPU, ma ogni volta passava attraverso diverse modifiche intermedie al volo.
Le spese generali erano significative e questo era un grande problema e così i produttori di processori, indipendentemente l'uno dall'altro, rilasciarono un set di istruzioni esteso (Intel VT-x / AMD SVM), che consentiva di eseguire il codice dei sistemi operativi ospiti DIRECTAMENTE sulla CPU host (saltando qualsiasi fase intermedia costosa, come avveniva in precedenza).
Con l'emergere di Intel VT-x / AMD SVM, è stato creato un nuovo livello speciale Ring -1 (meno uno). E ora su di esso funziona l'hypervisor, mentre gli ospiti operano su Ring 0 e ottengono accesso privilegiato alla CPU.
Quindi, in sintesi:
- l'host opera su Ring 0
- gli ospiti operano su Ring 0
- l'hypervisor opera su Ring -1
4) QEMU-KVM
KVM fornisce accesso agli ospiti a Ring 0 e utilizza QEMU per l'emulazione I/O (processore, dischi, rete, video, PCI, USB, porte seriali, ecc., che gli ospiti 'vedono' e con cui interagiscono).
Da qui QEMU-KVM (o KVM-QEMU) 🙂
CREDITI
P.S. Il testo di questo articolo è stato originariamente pubblicato nel canale Telegram come risposta a una domanda di uno dei membri del canale.
Scrivete nei commenti in quali punti non comprendo correttamente l'argomento o se c'è qualcosa da aggiungere.
Grazie!
Fonte: habr.com
