
Mijn huidige begrip:
1) KVM
KVM (Kernel-based Virtual Machine) ā hypervisor (VMM ā Virtual Machine Manager), die functioneert als een module binnen het Linux-besturingssysteem. De hypervisor is nodig om software uit te voeren in een niet-bestaande (virtuele) omgeving en tegelijkertijd de echte fysieke hardware waar deze software op draait, voor deze software te verbergen. De hypervisor fungeert als een 'tussenlaag' tussen de fysieke hardware (de host) en het virtuele besturingssysteem (de gast).
Aangezien KVM een standaardmodule van de Linux-kernel is, krijgt het alle voordelen van de kernel (zoals geheugenbeheer, scheduler, enz.). Uiteindelijk profiteren ook de gasten van al deze voordelen (omdat gasten draaien op de hypervisor, die op/in de kernel van het Linux-besturingssysteem draait).
KVM is erg snel, maar op zichzelf is het niet voldoende om een virtueel besturingssysteem uit te voeren, omdat hiervoor I/O-emulatie nodig is. Voor I/O (processor, schijven, netwerk, video, PCI, USB, seriƫle poorten, enz.) gebruikt KVM QEMU.
2) QEMU
QEMU (Quick Emulator) ā een emulator van verschillende apparaten, die het mogelijk maakt om besturingssystemen die voor ƩƩn architectuur zijn ontworpen, op een andere uit te voeren (bijvoorbeeld, ARM -> x86). Naast de processor emuleert QEMU verschillende randapparaten: netwerkkaarten, HDD's, videokaarten, PCI, USB, enz.
Dit werkt zo:
Instructies/binaire code (bijvoorbeeld, ARM) worden omgezet in tussentijdse platformonafhankelijke code met behulp van de TCG (Tiny Code Generator) en vervolgens wordt deze platformonafhankelijke binaire code omgezet in de doelinstructies/code (bijvoorbeeld, x86).
ARM -> tussentijdse_code -> x86
In wezen kun je virtuele machines op QEMU draaien op elke host, zelfs met oudere processor-modellen die geen Intel VT-x (Intel Virtualization Technology) of AMD SVM (AMD Secure Virtual Machine) ondersteunen. In dat geval zal dit echter erg traag zijn, omdat de uitvoerbare binaire code 'on the fly' twee keer moet worden hercompileren met TCG (TCG is een Just-in-Time compiler).
Met andere woorden, QEMU op zichzelf is geweldig, maar werkt erg traag.
3) Protection rings

Binaire softwarecode op processoren functioneert niet zomaar; het bevindt zich op verschillende niveaus (ringen / Protection rings) met verschillende toegangslevels tot gegevens, van het meest bevoorrechte (Ring 0) tot het meest beperkte, gereguleerde en 'strikt gecontroleerde' (Ring 3).
Het besturingssysteem (kernel) draait op Ring 0 (kernel mode) en kan met alle gegevens en apparaten doen wat het wilt. Gebruikersapplicaties draaien op Ring 3 (user mode) en hebben niet de vrijheid om alles te doen wat ze willen; in plaats daarvan moeten ze telkens toestemming vragen om bepaalde operaties uit te voeren (op deze manier hebben gebruikersapplicaties alleen toegang tot hun eigen gegevens en kunnen ze niet 'in de zandbak van anderen' komen). Ring 1 en 2 zijn bedoeld voor gebruik door stuurprogramma's.
Voor de uitvinding van Intel VT-x / AMD SVM, werkten hypervisors op Ring 0 en gasten op Ring 1. Omdat Ring 1 niet genoeg rechten heeft voor de normale werking van het besturingssysteem, moest de hypervisor bij elke geprivilegieerde aanroep van het gastensysteem dit aanroep wijzigen en deze uitvoeren op Ring 0 (zo ongeveer zoals QEMU het doet). Dat wil zeggen, de binaire code van de gast NIE werd rechtstreeks op de processor uitgevoerd, maar moest bij elke keer verschillende tussentijdse wijzigingen ondergaan.
De overhead was aanzienlijk en dit was een groot probleem. Toen hebben verschillende procesorfabrikanten onafhankelijk van elkaar een uitgebreide instructieset ontwikkeld (Intel VT-x / AMD SVM) die het mogelijk maakt om de code van de gastbesturingssystemen DIRECT op de hostprocessor uit te voeren (waardoor alle dure tussenstappen, zoals eerder, werden omzeild).
Met de komst van Intel VT-x / AMD SVM, werd er een speciale nieuwe laag Ring -1 (min ƩƩn) gecreƫerd. En nu draait de hypervisor daarop en de gasten draaien op Ring 0 en krijgen geprivilegieerde toegang tot de CPU.
Dat wil zeggen, uiteindelijk:
- de host draait op Ring 0
- de gasten draaien op Ring 0
- de hypervisor draait op Ring -1
4) QEMU-KVM
KVM biedt toegang aan gasten tot Ring 0 en gebruikt QEMU voor I/O-emulatie (processor, schijven, netwerk, video, PCI, USB, seriƫle poorten, enz., die de gasten 'zien' en waarmee ze werken).
Daarom QEMU-KVM (of KVM-QEMU) š
CREDITS
P.S. De tekst van dit artikel werd oorspronkelijk gepubliceerd op het Telegram-kanaal als antwoord op een vraag van een van de leden van het kanaal.
Laat in de reacties weten waar ik de materie niet goed begrijp of als er iets is om aan toe te voegen.
Bedankt!
Bron: habr.com
