Este articulo consta de tres partes:
- Introducción
- Paravirtualización
- Funcionamiento de Xen
Arquitectura de Xen:
Antes de empezar notaré que la maquina virtual anfitrión VM0 se suele notar como dominio 0 y las demás como dominio U.
En la máquina anfitrión el kernel se ejecuta en el nivel del microprocesador 0 así como el monitor o hypervisor. El resto de máquinas virtuales se ejecutan en el nivel 1. Las aplicaciones del todas las máquinas virtuales se ejecutan en nivel 3 el nivel con menores privilegios.
En paravirtualización todas las máquinas virtuales usan el procesador directamente haciendo el hypervisor de planificador del tiempo de ejecución de tal manera que las maquinas corran de forma nativa.
Cuando las máquinas virtuales acceden a un dispositivo este acceso pasa por el dominio 0 proporcionando el aislamiento necesario. De esta forma los controladores de los dispositivos de las máquinas virtuales no son más que una API que se comunica con el anfitrión, este posee la implementación de los controladores de los dispositivos virtuales que no son más que unas traducciones hacia los controladores nativos, realiza la operación, accediendo al dispositivo y devuelve el resultado a la máquina invitada.
Uno de los puntos más conflictivos de que se ejecuten las instrucciones de las máquinas virtuales nativamente sobre el procesador son las interrupciones por falta de página. Para esto el hypervisor genera una CPU virtual y una unidad de gestión de memoria (MMU) virtual, pudiendo así correr las máquinas con más o con menos procesadores que los reales.
Las aplicaciones que hacen uso de muchas interrupciones hardware provocan una caída de rendimiento debido a la intercesión del hypervisor entre el hardware real y el virtual, así que Xen intenta minimizar al máximo estas actuaciones.
Como también se puede ver en la figura Xen permite la ejecución de sistemas operativos sin modificación, hasta hace poco esto no era posible debido a la necesidad de que el kernel de estos se ejecutase a nivel de privilegio del procesador 1 en vez de 0, pero desde la salida de los últimos microprocesadores esto ya es posible por la inclusión de unas nuevas instrucciones al procesador, VT en el caso de Intel y Pacifica en el caso de AMD, que crean un nuevo nivel de privilegios por debajo del nivel 0 denominado “root-mode”, a partir de este nivel ya se pueden ejecutar cualquier sistema operativo sin modificación.
Tras dar una breve introducción a la arquitectura de Xen pasaremos a ver como lo hace.
Interfaz de la máquina virtual
Los temas a tratar por el hypervisor son los siguientes:
Gestión de memoria:
Segmentación: No se pueden usar descriptores segmentos con todos los privilegios y tampoco se pueden superponer los segmentos con el final del espacio de direcciones.
Paginación: El sistema operativo invitado tiene acceso directo a las tablas de paginación (TLB) pero para actualizarla debe validarlo el hypervisor.
CPU:
Protección: El sistema operativo invitado debe correr en un nivel de privilegios menor que el hypervisor.
Excepciones: El SO invitado debe registrar una tabla de manejadores de excepciones en Xen, de tal manera que, por ejemplo, las faltas de página las ejecute el Hypervisor.
Llamadas al sistema: Las llamadas al sistema se ejecutan directamente, para esto previamente se deben validar, de tal manera que no se mantenga el aislamiento entre máquinas virtuales.
Interrupciones: las interrupciones se remplazan por eventos del sistema.
Tiempo: Cada máquina virtual tiene una interfaz de tiempo, para mantener la diferencia entre el tiempo real y el tiempo virtual.
Gestión de memoria:
Virtualizar la memoria es la parte mas difícil, requiere la intervención del hypervisor además de la modificación de cada sistema operativo invitado. El primer problema es la virtualización de la TLB, en otras arquitecturas se puede manejar por software, de tal manera que puedan coexistir diferentes TLBs de un modo eficiente, pero la arquitectura x86 no lo permite, lo que conlleva que para cada mdificación en esta deba de ser capturada y validada.
Sabiendo esto la solución a la que se ha llegado consta de dos puntos:
1.- El sistema operativo invitado es responsable de manejar y alojar las tablas de paginación, con la intervención de Xen para asegurar el aislamiento y la seguridad.
2.- Xen residirá en los últimos 64 MB del espacio de direcciones de cada máquina virtual para que la intervención en la TLB no conlleve un cambio de contexto hacia el hypervisor.
Cada vez que el sistema operativo invitado requiera alojar una nueva página en memoria esta se registrará en Xen, lo que quiere decir que el sistema invitado debe renunciar a escribir directamente en la tabla de paginación, lo que conlleva una modificación del sistema operativo.
La segmentación se gestiona de un modo similar, las unicas restricciones que se imponen a los descriptores de segmento del sistema operativo invitado son que: deben tener menor privilegio que Xen y que no se debe permitir ningún acceso a la porción de memoria reservada por este.
CPU:
La virtualización de la CPU tiene importantes connotaciones, la primera es que Xen debe correr en un nivel de privilegios mayor que los sistemas operativos, lo que viola la suposición de que el sistema operativo debe ser la entidad con mayores privilegios en la máquina.
Así dado que la arquitectura x86 consta de cuatro niveles de privilegios (o rings), el hypervisor se situaría en el nivel 0, el de mayores privilegios, los sistemas operativos invitados en el nivel 1 y las aplicaciones que corran sobre estos en el nivel 3, el de menores privilegios. El uso de los tres niveles de privilegios permite garantizar la seguridad de que ni las aplicaciones podrán ejecutar instrucciones en el modo kernel del sistema operativo ni el sistema operativo podrá ejecutar las instrucciones privilegiadas del hypervisor, proporcionando un nivel de seguridad entre las distintas máquinas virtuales y el hypervisor. El problema para usar esta técnica en otras arquitecturas, es que algunas solo poseen dos niveles de privilegios, lo que provoca que el sistema operativo corra al mismo nivel que las aplicaciones, es decir, que se pierda el aislamiento entre el kernel del sistema operativo y las aplicaciones.
Las instrucciones que solo podría ejecutar Xen serían las relacionadas con las tablas de páginas y otras como “halt” que sirve para detener el procesador.
Las excepciones son tratadas de un modo bastante sencillo, una tabla contiene los punteros a las rutinas de cada excepción, esta tablas la registra Xen tras validarla. Esto es posible debido a que la gran mayoría de las rutinas son idénticas a las que se usarían directamente sin virtualización. Las rutinas que no son iguales son las que se han explicado antes, las relacionadas con memoria, para asegurar el aislamiento. Cuando se intenta ejecutar una instrucción fuera del nivel 0 la rutina de Xen crea una copia del marco de pila de esta en el sistema operativo invitado y le pasa el control a la excepción registrada por Xen.
Normalmente solo hay dos tipos de excepciones que puedan afectar notablemente el rendimiento del sistema por su frecuencia, las llamadas al sistema y las faltas de página. La solución que se utiliza en el caso de las llamadas al sistema es simplemente revisarlas para que se puedan ejecutar a nivel de privilegios 1 y dejar que se ejecuten directamente. Las faltas de página son un caso distinto ya que solo se pueden ejecutar en nivel 0 lo que implica que siempre las deba procesar Xen. El proceso de ejecución de estas es el siguiente: Desde el sistema operativo anfitrión se mira la falta de página, se mira que el segmento al que pertenezca la página este cargado y que la carga de esta página no afecte a los segmentos marcados como estáticos por Xen, si el segmento no está en memoria se sale de la subrutina con “iret”, con lo que en el sistema invitado se detectaría una doble falta, y lanzaría la interrupción correspondiente.
Dispositivos de entrada y salida:
En la virtualización completa se emulan completamente los comportamientos de los dispositivos de la máquina virtual, en la paravirtualización únicamente se crea una capa de abstracción sobre los dispositivos reales. Así Xen provee una interfaz de dispositivos genéricos con los que se interactúa. Cuando una máquina virtual utiliza un dispositivo la orden val al controlador de esta máquina virtual que no es más que una interfaz del controlador real que está en el sistema operativo anfitrión, aquí se traduce la petición al los drivers nativos de los dispositivos físicos y se ejecuta la orden.
Esto aunque parezca que es lo mismo que en otras plataformas de virtualización completa como VMware Workstation, no es así, por ejemplo, en el caso del disco duro en nuestro caso es una partición real o por LVM de nuestro disco, en la virtualización completa el disco duro no es más que un archivo de nuestro sistema de ficheros.
Otro ejemplo de esto sería la tarjeta gráfica, mientras que en la virtualización completa es impensable ejecutar juegos en 3D, la tarjeta gráfica virtual de Xen es una S3 Savage con soporte completo OpenGL que se ejecuta a la velocidad de la tarjeta real, habiéndose hecho pruebas de rendimiento con una perdida menor del 10%.
Portar un sistema operativo a Xen:
Este es un punto crucial para el éxito de Xen, ya que se trata de modificar software ajeno, si bien con los últimos procesadores no es necesario, sigue siendo mas eficiente. Dejo una tabla que demuestra la facilidad de portar un sistema operativo:
Sección del SO | Número de lineas |
| Linux | XP |
Independiente de arquitectura | 78 | 1299 |
Controlador de red virtual | 484 | - |
Controlador de dispositivo de bloques virtual | 1070 | - |
Código de Xen específico | 1363 | 3321 |
Total | 2995 | 4620 |
Porcentaje del total de lineas | 1.36% | 0.04% |
Conclusión:
La paravirtualización es un tema que va a dar mucho que hablar ahora que se ha añadido soporte a los microprocesadores de los diferentes fabricantes de la arquitectura x86. Dentro de poco aparecerán versiones híbridas entre la virtualización completa y esta como la futura VMware Workstation 6 y la respectiva de Parallels.
Yo creo que a partir de la popularización de estas técnicas será la evolución hacia los microkernels, ya que, que evitaría que yo construyese un servidor web corriendo únicamente sobre Xen, sin sistema operativo intermediario, gestionando directamente un sistema de archivos, creado por mi y orientado exactamente al uso que le quiero dar, o una base de datos, o otros tipos de aplicaciones que requieran un uso intensivo y especializado de los recursos como los juegos.
Dicen que la informática ha avanzado mucho, pero en términos de sistemas operativos esta evolución no ha sido tal, ha sido mas de aspecto que de funcionamiento, quizás sea este el paso que nos lleve a la evolución de este, propiciando la creación de seudo-sistemas operativos para propósitos específicos son las típicas barreras para su expansión, los controladores.