
Moje aktuální porozumění:
1) KVM
KVM (Kernel-based Virtual Machine) – hypervisor (VMM – Virtual Machine Manager), který funguje jako modul v operačním systému Linux. Hypervisor je potřebný k tomu, aby spouštěl určité software ve fiktivním (virtuálním) prostředí a přitom skrýval skutečný fyzický hardware, na kterém tento software běží. Hypervisor slouží jako „propojka“ mezi fyzickým hardwarem (hostitelem) a virtuálním OS (hostem).
Jelikož je KVM standardním modulem jádra Linuxu, získává od jádra všechny potřebné výhody (práce s pamětí, plánování atd.). A tím pádem všechny tyto výhody mají i hosty (protože hosté běží na hypervisoru, který funguje na/se jádrem OS Linux).
KVM je velmi rychlý, ale sám o sobě nestačí pro spuštění virtuálního OS, protože k tomu je potřeba emulace I/O. Pro I/O (procesor, disky, síť, video, PCI, USB, sériové porty atd.) KVM využívá QEMU.
2) QEMU
QEMU (Quick Emulator) – emulátor různých zařízení, který umožňuje spouštět operační systémy určené pro jednu architekturu na jiné (např. ARM –> x86). Kromě procesoru QEMU emuluje různá periferní zařízení: síťové karty, HDD, grafické karty, PCI, USB atd.
Funguje to takto:
Instrukce/binární kód (např. ARM) jsou konvertovány na mezikod nezávislý na platformě pomocí konvertoru TCG (Tiny Code Generator) a tento mezikód je poté konvertován na cílové instrukce/kód (např. x86).
ARM –> mezikód –> x86
V podstatě můžete spouštět virtuální stroje na QEMU na jakémkoli hostiteli, i na starých modelech procesorů, které nepodporují Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Nicméně v takovém případě to bude fungovat velmi pomalu, protože vykonávaný binární kód je nutné překompilovat za běhu dvakrát pomocí TCG (TCG je Just-in-Time compiler).
Tedy samotný QEMU je velmi skvělý, ale funguje velmi pomalu.
3) Ochranná kola

Binární programový kód na procesorech nepracuje jen tak, ale je umístěn na různých úrovních (kruzích / ochranných kroužcích) s různými úrovněmi přístupu k datům, od nejprivilegovanějšího (Ring 0) až po nejomezenější, regulovaného a "s utaženými šrouby" (Ring 3).
Operační systém (jádro OS) funguje na úrovni Ring 0 (jádrový režim) a může používat jakákoliv data a zařízení bez omezení. Uživatelké aplikace běží na úrovni Ring 3 (uživatelský režim) a nemohou si dělat, co chtějí; místo toho musí vždy žádat o přístup k provádění určité operace (uživatelské aplikace mají přístup pouze k vlastním datům a nemohou „zasahovat“ do „cizího prostoru“). Ring 1 a 2 jsou určeny pro ovladače.
Před vynálezem Intel VT-x / AMD SVM pracovaly hypervizory na Ring 0, zatímco hosté fungovali na Ring 1. Protože Ring 1 nemá dostatečná práva pro normální fungování OS, musel hypervizor při každém privilegovaném volání od hostitelského systému upravit toto volání a provést ho na Ring 0 (něco podobného tomu, co dělá QEMU). Tedy hostitelský binární kód NE byl prováděn přímo na procesoru a pokaždé podléhal několika meziúpravám.
Náklady byly značné a to byl velký problém, proto výrobci procesorů nezávisle na sobě vydali rozšířenou sadu instrukcí (Intel VT-x / AMD SVM), které umožnily vykonávat kód hostitelských OS PŘÍMO na procesoru hostitele (bez zbytečných mezistupňů, jak tomu bylo dříve).
S příchodem Intel VT-x / AMD SVM byl vytvořen nový speciální úroveň Ring -1 (minus jedna). A nyní na něm běží hypervizor, zatímco hosté jsou na Ring 0 a mají privilegovaný přístup k CPU.
Tedy výsledkem je:
- hostitel běží na Ring 0
- hosté běží na Ring 0
- hypervizor běží na Ring -1
4) QEMU-KVM
KVM poskytuje hostům přístup k Ring 0 a používá QEMU pro emulaci I/O (procesor, disky, síť, video, PCI, USB, sériové porty atd., které „vidí“ a se kterými hosté pracují).
Odtud QEMU-KVM (nebo KVM-QEMU) 🙂
CREDITS
P.S. Text tohoto článku byl původně publikován na Telegram kanálu jako odpověď na otázku jednoho z členů kanálu.
Napište do komentářů, v jakých místech špatně chápu téma nebo pokud máte co doplnit.
Děkuji!
Zdroj: habr.com
