Con el desarrollo de los sistemas operativos modernos se han ido, poco a poco, virtualizando algunos recursos del hardware del ordenador como, por ejemplo, la memoria. Pero, ¿qué quiere decir virtualizar? En pocas palabras, podríamos decir que consiste en conseguir que algo inexistente parezca algo real, algo físico. Y en el campo de los sistemas operativos, una acepción posible consistiría en la serie de tecnologías, tanto hardware como software, que permiten que sobre un mismo ordenador se ejecuten varios sistemas operativos de forma concurrente, de manera que cada uno de ellos opere como si estuviese corriendo sobre un hardware que no comparte con ningún otro.

Desde hace años han existido soluciones software que conseguían ejecutar unos sistemas operativos dentro de otros, o que incluso virtualizaban arquitecturas de microprocesador totalmente distintas de la del host en que se ejecutaba el software de virtualización. Sin embargo, hasta ahora, no existía un soporte hardware diseñado específicamente para conseguir un mejor rendimiento del software que corría sobre los ordenadores virtuales que se generaban con este tipo de productos. Recientemente, tanto Intel como AMD, han desarrollado diversos mecanismos de apoyo por hardware a las tareas de virtualización, por lo que tan sólo es cuestión de tiempo que aparezcan los primeros sistemas operativos con este tipo de soporte o bien soluciones de otro tipo que simplemente crearían máquinas virtuales sobre las que se instalaría el o los sistemas operativos que el usuario desee.

Terminología básica

Los principales conceptos que hay que comprender en el campo de la virtualización son el de host y cliente o invitado. El primero de ellos hace referencia a un sistema operativo o a un software concreto que dispone de la capacidad de crear máquinas virtuales sobre una plataforma física, haciendo posible que el software invitado (normalmente un sistema operativo completo) crea que se está ejecutando sobre un ordenador completo sobre el que puede controlar todos los recursos de su hardware. El host no tiene que ser un sistema operativo, ya que puede tratarse de una aplicación que sea la que toma el control del sistema cuando éste arranca, proporcionando al usuario una interfaz mínima que le permita seleccionar qué máquinas virtuales desea arrancar junto con el sistema operativo asociado a la misma. Sin embargo, también es posible desarrollar sistemas operativos que dispongan de servicios de virtualización de la plataforma hardware, abriendo la puerta, por ejemplo, a la posibilidad de arrancar un sistema operativo desde dentro de otro sin que ambos se interfieran.

AMD

Este fabricante de procesadores ha publicado, de momento, una especificación denominada IOMMU que detalla el funcionamiento de los mecanismos de virtualización de los recursos de entrada/salida que va a implementar en sus nuevos productos. Esta documentación se centra especialmente en cómo proteger zonas de memoria frente a accesos de tipo DMA, ya que dichos accesos son iniciados y controlados normalmente por hardware externo al microprocesador y se efectúan a través de los buses del sistema, como PCI o el nuevo PCI Express. La tecnología en la que está trabajando AMD también hace posible que dispositivos hardware que no son capaces de gestionar más de 4 GB de memoria física, puedan acceder a las direcciones de memoria situadas más allá de dicho límite mediante un sistema de remapeo de direcciones.

A pesar de que el bus AGP está en retroceso, AMD ha incluido un soporte especial para la tabla GART (Graphics Address Remapping Table) que definía dicho bus y que permitía que los procesadores gráficos direccionasen texturas almacenadas en la memoria principal del ordenador. De esta forma, los usuarios que empleen un procesador AMD con soporte de virtualización apoyado por hardware, podrían, al menos en teoría, usarlo sobre una placa base relativamente antigua dotada de bus AGP.

Sin embargo, quizá la función más crítica en un entorno virtualizado sea la que hace posible que un sistema operativo invitado pueda gestionar directamente los recursos de un determinado dispositivo hardware. Esta cuestión es importante y en absoluto trivial, ya que hemos de tener en cuenta que podría darse una situación en la que más de un sistema operativo estuviese ejecutándose al mismo tiempo sobre un mismo hardware, todo ello gestionado a través de un software supervisor. Es por ello imprescindible disponer de mecanismos que ordenen y gestionen de forma correcta los accesos que las diversas máquinas virtuales realizan al hardware que comparten entre sí.

Un sistema que soporte IOMMU asigna a cada dispositivo físico un dominio de protección y un conjunto concreto de tablas de páginas del procesador. Cuando un dispositivo intenta leer o escribir en la memoria del sistema, dicho acceso se intercepta, se determina el dominio de protección al que se ha asignado el dispositivo y se usan las entradas de la tabla TLB (Translation Lookaside Buffer) asociadas a dicho domino para decidir si se permite el acceso y, además, para calcular la dirección de memoria física a la que se accederá.

En general puede decirse que el concepto que subyace bajo IOMMU es el de una unidad de gestión de memoria muy similar a la integrada en casi todos los microprocesadores modernos, salvo en que realiza traducciones de direcciones de memoria y protección mediante página de memoria frente a accesos realizados desde periféricos en lugar de los efectuados por el procesador, los cuales los gestiona la MMU de dicho elemento.

Algunos límites de la propuesta de AMD

Sin embargo, IOMMU también tiene dos limitaciones importantes. La primera consiste en que no proporciona a los dispositivos físicos una indicación precisa sobre si ha fallado una operación de acceso a memoria. La segunda viene dada por la arquitectura Hypertransport que emplean los procesadores actuales de AMD para comunicarse entre sí y con otros dispositivos periféricos. Ya que un sistema de tipo AMD64 puede contener varios nodos, conectados entre sí a través de Hypertransport, cada uno de dichos nodos debe soportar IOMMU para que así se protejan todos los accesos a memoria que realicen los periféricos independientemente del nodo sobre el que se ejecuten finalmente. Esto es así debido a que la IOMMU sólo tiene acceso al tráfico de datos que pasa a través del nodo en que reside físicamente, no pudiendo acceder al tráfico de datos que tiene lugar en otros nodos de un sistema multiprocesador.

Pero, ¿cómo se controla por software la IOMMU? El control de este elemento físico lo ha implementado AMD mediante una serie de comandos que se escriben en un buffer circular que reside en la memoria del sistema. Cuando se escribe un comando en dicha zona de memoria, el software escribe un nuevo valor en un registro del hardware que indica donde está situado el último elemento del buffer circular. La IOMMU detecta dicha escritura y, acto seguido, comienza la ejecución de los comandos contenidos en el buffer.

Parece también lógico que la IOMMU debería ser capaz de comunicar al procesador una serie de eventos que pueden requerir la atención de la CPU. Esta notificación se efectúa también mediante un buffer circular en el que la IOMMU va registrando los eventos que deberá atender el procesador. Si se da la situación de que el buffer circular de notificación de eventos e