
Mi comprensión actual:
1) KVM
KVM (Máquina Virtual basada en el Núcleo) es un hipervisor (VMM - Gestor de Máquinas Virtuales) que funciona como un módulo en el sistema operativo Linux. El hipervisor se necesita para ejecutar cierto software en un entorno no existente (virtual) y ocultar este software del hardware físico real en el que se ejecuta. El hipervisor actúa como un 'intermediario' entre el hardware físico (host) y el sistema operativo virtual (invitado).
Dado que KVM es un módulo estándar del núcleo de Linux, recibe todas las ventajas del núcleo (gestión de memoria, planificador, etc.). Como resultado, todas estas ventajas también se trasladan a los invitados (ya que los invitados funcionan en el hipervisor, que opera en/en el núcleo del sistema operativo Linux).
KVM es muy rápido, pero por sí solo no es suficiente para ejecutar un sistema operativo virtual, ya que se requiere emulación de I/O. Para I/O (procesadores, discos, red, video, PCI, USB, puertos seriales, etc.), KVM utiliza QEMU.
2) QEMU
QEMU (Emulador Rápido) es un emulador de diversos dispositivos que permite ejecutar sistemas operativos diseñados para una arquitectura en otra (por ejemplo, ARM -> x86). Además del procesador, QEMU emula varios dispositivos periféricos: tarjetas de red, HDD, tarjetas de video, PCI, USB, etc.
Funciona así:
Las instrucciones/código binario (por ejemplo, ARM) se convierten en código intermedio independiente de la plataforma mediante un convertidor TCG (Generador de Código Reducido) y luego, este código binario independiente de la plataforma se convierte en instrucciones/código objetivo (por ejemplo, x86).
ARM -> código_intermedio -> x86
En esencia, puedes ejecutar máquinas virtuales en QEMU en cualquier host, incluso en modelos de procesador antiguos que no admiten Intel VT-x (Tecnología de Virtualización Intel) / AMD SVM (Máquina Virtual Segura AMD). Sin embargo, en este caso, funcionará bastante lento, dado que el código binario ejecutable debe recompilarse sobre la marcha dos veces, utilizando TCG (TCG es un compilador Just-in-Time).
Es decir, QEMU por sí solo es increíble, pero funciona muy lento.
3) Anillos de Protección

El código de programación binario en los procesadores no funciona arbitrariamente, sino que se organiza en diferentes niveles (anillos / Anillos de Protección) con diferentes niveles de acceso a los datos, desde el más privilegiado (Anillo 0) hasta el más restringido, regulado y 'con tuercas apretadas' (Anillo 3).
El sistema operativo (núcleo del SO) funciona en Ring 0 (modo kernel) y puede hacer lo que quiera con cualquier dato y dispositivo. Las aplicaciones de usuario funcionan en el nivel Ring 3 (modo usuario) y no tienen derecho a hacer todo lo que deseen, sino que deben solicitar acceso cada vez que necesiten realizar alguna operación (así, las aplicaciones de usuario solo tienen acceso a sus propios datos y no pueden «invadir» la «arena de juegos» de otros). Ring 1 y 2 están destinados al uso por controladores.
Antes de la invención de Intel VT-x / AMD SVM, los hipervisores operaban en Ring 0, mientras que los huéspedes funcionaban en Ring 1. Dado que Ring 1 no tenía suficientes privilegios para el funcionamiento normal del SO, cada vez que había una llamada privilegiada desde el sistema huésped, el hipervisor tenía que modificar esa llamada en tiempo real y ejecutarla en Ring 0 (algo similar a lo que hace QEMU). Es decir, el código binario del huésped NO se ejecutaba directamente en el procesador, y cada vez pasaba por varias modificaciones intermedias en tiempo real.
Los costes fueron significativos y esto representó un gran problema, y entonces los fabricantes de procesadores, de manera independiente, lanzaron un conjunto de instrucciones ampliadas (Intel VT-x / AMD SVM) que permiten ejecutar el código de los sistemas operativos huéspedes DIRECTAMENTE en el procesador del host (eliminando todos los costosos pasos intermedios, como se hacía antes).
Con la llegada de Intel VT-x / AMD SVM, se creó un nuevo nivel especial Ring -1 (menos uno). Ahora en este nivel opera el hipervisor, mientras que los huéspedes operan en Ring 0 y obtienen acceso privilegiado a la CPU.
Es decir, en resumen:
- el host opera en Ring 0
- los huéspedes operan en Ring 0
- el hipervisor opera en Ring -1
4) QEMU-KVM
KVM proporciona a los huéspedes acceso a Ring 0 y utiliza QEMU para la emulación de I/O (procesador, discos, red, video, PCI, USB, puertos serie, etc., que «ven» y con los que trabajan los huéspedes).
De aquí QEMU-KVM (o KVM-QEMU) 🙂
CREDITOS
P.D. El texto de este artículo fue publicado originalmente en el canal de Telegram como respuesta a la pregunta de uno de los participantes del canal.
Escriba en los comentarios en qué puntos no entiendo correctamente el tema o si hay algo que agregar.
¡Gracias!
Fuente: habr.com
