
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 software in un ambiente virtuale non esistente, nascondendo allo stesso tempo l'hardware fisico reale su cui si esegue il software. L'hypervisor funge da "intermediario" tra l'hardware fisico (host) e il sistema operativo virtuale (guest).
Poiché KVM è un modulo standard del kernel Linux, riceve dal kernel tutte le funzionalità necessarie (gestione della memoria, pianificatore, ecc.). Di conseguenza, tutti questi vantaggi si trasferiscono anche ai guest (poiché i guest lavorano su un hypervisor che opera nel/nel kernel del sistema operativo Linux).
KVM è molto veloce, ma di per sé non è sufficiente per avviare un sistema operativo virtuale, poiché è necessaria anche l'emulazione delle I/O. Per l'I/O (processore, 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, da ARM a x86). Oltre al processore, QEMU emula vari dispositivi periferici: schede di rete, HDD, schede video, PCI, USB, e altro ancora.
Funziona così:
Le istruzioni / il codice binario (ad esempio, ARM) vengono convertiti in un codice intermedio indipendente dalla piattaforma tramite il convertitore TCG (Tiny Code Generator), e poi questo codice binario indipendente dalla piattaforma viene convertito nelle istruzioni / codice di destinazione (ad esempio, x86).
ARM –> codice_intermedio –> x86
In sostanza, puoi eseguire macchine virtuali su QEMU su qualsiasi host, anche su vecchi modelli di processori che non supportano Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Tuttavia, in tal caso, funzionerà molto lentamente, poiché il codice binario eseguibile deve essere ricompilato al volo due volte, tramite TCG (TCG è un compilatore Just-in-Time).
Cioè, QEMU di per sé è eccezionale, ma funziona molto lentamente.
3) Anelli di protezione

Il codice binario sui processori non opera a caso, ma si dispone a vari livelli (anelli / Protection rings) con diversi livelli di accesso ai dati, dal più privilegiato (Ring 0) al più ristretto, regolato e «con le viti serrate» (Ring 3).
Il sistema operativo (nucleo OS) opera su Ring 0 (modalità kernel) e può fare ciò che desidera con qualsiasi dato e dispositivo. Le applicazioni utente operano a livello Ring 3 (modalità utente) e non hanno il diritto di fare tutto ciò che vogliono, ma devono ogni volta richiedere l'accesso per effettuare determinate operazioni (in questo modo, le applicazioni utente hanno accesso solo ai propri dati e non possono «infilarsi» nella «sabbiere» degli altri). Ring 1 e 2 sono destinati all'uso da parte dei driver.
Prima dell'invenzione di Intel VT-x / AMD SVM, gli ipervisor operavano su Ring 0, mentre le macchine virtuali su Ring 1. Poiché Ring 1 non aveva abbastanza privilegi per il corretto funzionamento del sistema operativo, ad ogni chiamata privilegiata dal sistema ospite, l'ipervisor doveva modificare on-the-fly questa chiamata ed eseguirla su Ring 0 (circa come fa QEMU). In altre parole, il codice binario dell'ospite NO non veniva eseguito direttamente sul processore, ma ogni volta subiva diverse modifiche intermedie.
Le spese generali erano significative e ciò rappresentava un grande problema; così i produttori di processori, in modo indipendente, hanno rilasciato un set di istruzioni esteso (Intel VT-x / AMD SVM) che consente di eseguire codice dei sistemi operativi ospiti DIRECTAMENTE sul processore host (saltando tutte le costose fasi intermedie, come avveniva in passato).
Con l'arrivo di Intel VT-x / AMD SVM, è stato creato un nuovo livello speciale Ring -1 (meno uno). Ora su di esso opera l'ipervisor e gli ospiti operano su Ring 0, ottenendo accesso privilegiato alla CPU.
Cioè, alla fine:
- l'host opera su Ring 0
- gli ospiti operano su Ring 0
- l'ipervisor opera su Ring -1
4) QEMU-KVM
KVM fornisce accesso agli ospiti a Ring 0 e utilizza QEMU per emulare 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 alla 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
