
Moje trenutno razumijevanje:
1) KVM
KVM (Kernel-based Virtual Machine) – hipervizor (VMM – Virtual Machine Manager) koji radi kao modul na operativnom sustavu Linux. Hipervizor je potreban za pokretanje softvera u nepostojećem (virtuelnom) okruženju, dok skriva stvarno fizičko hardver na kojem taj softver radi. Hipervizor djeluje kao 'veza' između fizičkog hardvera (hosta) i virtuelnog operativnog sustava (gosta).
Budući da je KVM standardni modul jezgre Linuxa, dobiva od jezgre sve potrebne resurse (upravljanje memorijom, planer i sl.). Tako da na kraju, sve te prednosti pripadaju i gostima (jer gosti rade na hipervizoru koji radi unutar jezgre OS Linux).
KVM je vrlo brz, ali sam po sebi nije dovoljan za pokretanje virtuelnog operativnog sistema, jer je potrebna emulacija I/O. Za I/O (procesor, disk, mreža, video, PCI, USB, serijski portovi itd.) KVM koristi QEMU.
2) QEMU
QEMU (Quick Emulator) – emulatore raznih uređaja koji omogućava pokretanje operativnih sistema namijenjenih jednoj arhitekturi na drugoj (na primjer, ARM –> x86). Osim procesora, QEMU emulira razne periferne uređaje: mrežne kartice, HDD, grafičke kartice, PCI, USB itd.
Radi to ovako:
Upute/binarni kod (na primjer, ARM) pretvaraju se u međuprostorni kod pomoću konvertera TCG (Tiny Code Generator) i taj međuprostorni binarni kod se zatim pretvara u ciljne upute/kod (na primjer, x86).
ARM –> međuprostorni_kod –> x86
U suštini, možete pokrenuti virtuelne mašine na QEMU na bilo kojem hostu, čak i sa starim modelima procesora koji ne podržavaju Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Međutim, u tom slučaju, radit će vrlo sporo, zbog toga što se izvršni binarni kod mora prekompilirati u hodu dva puta, pomoću TCG (TCG je Just-in-Time compiler).
Dakle, sam po sebi QEMU je izvanredno moćan, ali radi vrlo sporo.
3) Protection rings

Binarni programski kod na procesorima ne radi tek tako, već se nalazi na različitim razinama (prstenima / Protection rings) s različitim razinama pristupa podacima, od najprivilegiranijeg (Ring 0) do najograničenijeg, reguliranog i 's zategnutim maticama' (Ring 3).
Operacijski sustav (jezgra OS) radi na Ringu 0 (kernel mode) i može raditi sa svim podacima i uređajima kako želi. Korisničke aplikacije rade na razini Ringa 3 (user mode) i ne smiju raditi sve što žele, već svaku operaciju moraju zatražiti odobrenje (tako korisničke aplikacije imaju pristup samo vlastitim podacima i ne mogu "ući" u "tuđu sandbox"). Ring 1 i 2 namijenjeni su korištenju od strane drajvera.
Prije izuma Intel VT-x / AMD SVM, hipervizori su radili na Ringu 0, dok su gosti radili na Ringu 1. Budući da Ring 1 nema dovoljno prava za normalno funkcioniranje OS-a, pri svakom privilegiranom pozivu iz gostujućeg sustava, hipervizoru je bilo potrebno u trenutku modificirati taj poziv i izvršiti ga na Ringu 0 (približno kao što to radi QEMU). Dakle, gostujući binarni kod NE izvršavao se izravno na procesoru, a svaka se putanja u trenutku prolazila kroz nekoliko međufaza modificiranja.
Troškovi su bili značajni i to je bio veliki problem, pa su proizvođači procesora, neovisno jedan o drugome, izradili prošireni skup instrukcija (Intel VT-x / AMD SVM) koji omogućuju izvršavanje koda gostujućih OS-a IZRAVNO na procesoru domaćina (zaobilazeći sve skupe međufaze, kao što je to bilo ranije).
S pojavom Intel VT-x / AMD SVM, stvoren je novi poseban razina Ringa -1 (minus jedan). I sada na njemu radi hipervizor, a gosti rade na Ringu 0 i dobivaju privilegiran pristup CPU-u.
Dakle, na kraju:
- domaćin radi na Ringu 0
- gosti rade na Ringu 0
- hipervizor radi na Ringu -1
4) QEMU-KVM
KVM omogućava gostima pristup Ringu 0 i koristi QEMU za emulaciju I/O (procesor, diskovi, mreža, video, PCI, USB, serijski portovi itd., koje "vide" i s kojima rade gosti).
Odatle QEMU-KVM (ili KVM-QEMU) 🙂
ZAHVALE
P.S. Tekst ovog članka izvorno je objavljen na Telegram kanalu kao odgovor na pitanje jednog od sudionika kanala.
Napišite u komentarima gdje mislim pogrešno o ovoj temi ili ako postoji nešto što treba dopuniti.
Hvala!
Izvor: habr.com
