
Înțelegerea mea actuală:
1) KVM
KVM (Kernel-based Virtual Machine) – un hipervizor (VMM – Virtual Machine Manager) care funcționează ca un modul pe sistemul de operare Linux. Hipervizorul este necesar pentru a rula un anumit software într-un mediu virtual (inexistent) și, în același timp, pentru a ascunde hardware-ul fizic real pe care rulează acest software. Hipervizorul acționează ca un „intermediar” între hardware-ul fizic (gazda) și sistemul de operare virtual (gost).
Dat fiind că KVM este un modul standard al nucleului Linux, acesta beneficiază de toate avantajele furnizate de nucleu (gestionarea memoriei, programarea etc.). Prin urmare, în cele din urmă, toate aceste avantaje ajung și la gazde (deoarece gazdele funcționează pe hipervizor, care rulează în/pe nucleul OS Linux).
KVM este foarte rapid, dar de unul singur nu este suficient pentru a rula un sistem de operare virtual, deoarece este necesară emularea I/O. Pentru I/O (procesor, discuri, rețea, video, PCI, USB, porturi seriale etc.) KVM folosește QEMU.
2) QEMU
QEMU (Quick Emulator) – un emulator de dispozitive diverse, care permite rularea sistemelor de operare concepute pentru o arhitectură pe alta (de exemplu, ARM –> x86). Pe lângă procesor, QEMU emulează diverse dispozitive periferice: plăci de rețea, HDD-uri, plăci video, PCI, USB etc.
Funcționează astfel:
Instrucțiunile/codul binar (de exemplu, ARM) sunt convertite într-un cod intermediar portabil cu ajutorul converterului TCG (Tiny Code Generator) și apoi acest cod binar portabil este convertit în instrucțiuni/cod țintă (de exemplu, x86).
ARM –> cod_intermediar –> x86
În esență, puteți rula mașini virtuale pe QEMU pe orice gazdă, chiar și pe modele mai vechi de procesoare care nu suportă Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Totuși, în acest caz, va funcționa destul de lent, deoarece codul binar executabil trebuie recompilat în timp real de două ori, folosind TCG (TCG – este un compilator Just-in-Time).
Deci, QEMU este extrem de avansat, dar funcționează foarte lent.
3) Rondele de protecție

Codul binar software pe procesoare nu funcționează pur și simplu, ci este distribuit pe diferite niveluri (rondele/protecția) cu diverse niveluri de acces la date, de la cel mai privilegiat (Ring 0) până la cel mai restricționat, reglementat și „strâns” (Ring 3).
Sistemul de operare (nucleul OS) funcționează pe Ring 0 (mod kernel) și poate efectua orice operațiune asupra oricăror date și dispozitive. Aplicațiile utilizatorilor funcționează la nivelul Ring 3 (mod utilizator) și nu au dreptul să facă tot ce doresc, ci trebuie să solicite de fiecare dată accesul pentru a efectua o operațiune anume (în acest fel, aplicațiile utilizatorilor au acces doar la datele proprii și nu pot „invada” „arhiva” altora). Ring 1 și 2 sunt destinate utilizării de către drivere.
Până la invenția Intel VT-x / AMD SVM, hypervizorii funcționau pe Ring 0, iar oaspeții funcționau pe Ring 1. Deoarece Ring 1 nu are suficiente privilegii pentru a funcționa normal, hypervizorul trebuia să modifice în timp real fiecare apel privilegiat din sistemul oaspete și să-l execute pe Ring 0 (aproximativ așa cum o face QEMU). Adică, codul binar al oaspeților NU era executat direct pe procesor, iar de fiecare dată trecea prin câteva modificări intermediare în timp real.
Cheltuielile de procesare erau semnificative și aceasta era o mare problemă, iar atunci producătorii de procesoare, independent unul de altul, au lansat un set extins de instrucțiuni (Intel VT-x / AMD SVM), care permite executarea codului sistemelor de operare oaspete DIRECT pe procesorul gazdă (o ocolire a tuturor etapelor intermediare costisitoare, așa cum era înainte).
Odată cu introducerea Intel VT-x / AMD SVM, a fost creat un nou nivel special Ring -1 (minus unu). Și acum, pe acesta funcționează hypervizorul, iar oaspeții funcționează pe Ring 0 și obțin acces privilegiat la CPU.
Adică, în final:
- gazda funcționează pe Ring 0
- oaspeții funcționează pe Ring 0
- hypervizorul funcționează pe Ring -1
4) QEMU-KVM
KVM oferă oaspeților acces la Ring 0 și folosește QEMU pentru a emula I/O (procesor, discuri, rețea, video, PCI, USB, porturi seriale etc., pe care oaspeții le „văd” și cu care lucrează).
Așadar, QEMU-KVM (sau KVM-QEMU) 🙂
CREDITE
P.S. Textul acestui articol a fost publicat inițial pe canalul Telegram ca un răspuns la întrebarea unuia dintre participanții canalului.
Scrieți în comentarii unde nu înțeleg corect tema sau dacă există ceva de adăugat.
Mulțumesc!
Sursa: habr.com
