# Requerimientos de virtualización de Popek y Goldberg

Los Requerimientos de virtualización de Popek y Goldberg son un conjunto de condiciones suficientes para que una arquitectura de computadores soporte eficientemente la virtualización. Fueron elaborados por Gerald J. Popek y Robert P. Goldberg en su artículo de 1974 Formal Requirements for Virtualizable Third Generation Architectures. Aunque los requisitos se derivan de suposiciones simplificadas, todavía constituyen una manera eficaz de determinar si una arquitectura soporta eficientemente la virtualización, y proporciona líneas maestras para el diseño de arquitecturas virtualizables.

## Definición de máquina virtual

Los sistemas de máquinas virtuales son capaces de virtualizar un conjunto completo de recursos de hardware, incluyendo al procesador (o procesadores), memoria, recursos de almacenamiento y dispositivos periféricos. Un monitor de máquina virtual (VMM, Virtual Machine Monitor, también llamado hipervisor) es la pieza fundamental de software que provee la abstracción de una máquina virtual. Hay tres características de interés cuando se analiza el entorno creado por un VMM:
En la terminología de Popek y Goldberg, un Monitor de Máquina Virtual debe presentar las tres propiedades. En la terminología usada en el libro de referencia de Smith y Nair (2005), se asume que los monitores cumplen las características de equivalencia y control de recursos, y aquellos que cumplen además la característica de performance son llamados monitores eficientes.
Popek y Goldberg describen las características que el Set de Instrucciones de la Arquitectura (ISA) de la máquina física debe poseer para poder correr VMMs que presenten las propiedades arriba mencionadas. Su análisis deriva tales características usando un modelo de "arquitecturas de tercera generación" (por ej. IBM 360, Honeywell 6000, DEC PDP-10) que es sin embargo suficientemente general para ser extendido a máquinas actuales. Este modelo incluye un procesador que opera en modo núcleo (o de sistema) o modo de usuario, y tiene acceso a memoria lineal y uniformemente direccionable. Se asume que un subconjunto del set de instrucciones solo puede ser usado desde el modo de sistema y que la memoria es direccionada relativamente a un registro de reubicación. La E/S y las interrupciones no están modeladas.

## Teoremas de la virtualización

Para llegar a sus teoremas de virtualización, que dan condiciones suficientes (mas no necesarias) para la virtualización, Popek y Goldberg clasifican las instrucciones de un ISA en 3 diferentes grupos:

### Instrucciones privilegiadas

    Aquellas que generan un trap si el procesador se encuentra en modo de usuario pero no lo hacen si se encuentra en modo núcleo.

### Instrucciones sensibles de control

    Aquellas que intentan cambiar la configuración de los recursos en el sistema.

### Instrucciones sensibles de comportamiento

    Aquellas cuyo comportamiento o resultado dependen de la configuración de los recursos.
El resultado principal del análisis de Popek y Goldberg puede entonces ser expresado de la siguiente forma.
Intuitivamente, el teorema establece que para construir un VMM es suficiente con que todas las instrucciones que pueden afectar el correcto funcionamiento del VMM (las instrucciones sensibles) siempre generen un trap y pasen el control al VMM. Esto garantiza la propiedad de control de recursos. Las instrucciones no privilegiadas, en cambio, deben ser ejecutadas nativamente (para lograr eficiencia). Así también se consigue la propiedad de equivalencia.
Este teorema también brinda una técnica simple para implementar un VMM, llamada trap-and-emulate virtualization (virtualización de atrapar y emular), más recientemente llamada virtualización clásica: dado que todas las instrucciones sensibles se comportan apropiadamente, todo lo que el VMM tiene que hacer es atrapar y emular cada una de ellas.
Un problema relacionado es el de obtener condiciones suficientes para la virtualización recursiva, esto es, las condiciones bajo las que se puede construir un VMM que pueda correr sobre una copia de sí mismo. Popek y Goldberg presentan las siguientes condiciones suficientes.
Algunas arquitecturas, como la x86 sin asistencia de hardware, no cumplen estas condiciones, así que no pueden ser virtualizadas de la manera clásica. Pero aun pueden ser completamente virtualizadas (en el caso de x86, a nivel de CPU y MMU) usando diferentes técnicas como la traducción binaria, que reemplaza las instrucciones sensibles que no generan traps, también llamadas instrucciones críticas. Este procesamiento adicional hace al VMM menos eficiente en teoría, pero los traps de hardware también tienen un costo de performance no despreciable, y un sistema de traducción binaria bien afinado puede conseguir rendimiento comparable, lo cual sucede en el caso de las traducción binaria de x86 en relación con la primera generación de x86 asistida por hardware, que solamente hacía que las instrucciones sensibles fueran atrapables. Esto lleva a un teorema con diferentes condiciones suficientes.

## Manejo de las instrucciones críticas

Las condiciones para la virtualización del Set de Instrucciones de la Arquitectura (ISA), expresado en el Teorema 1, pueden ser relajadas a expensas de la propiedad de eficiencia. De hecho, se construyen a menudo VMMs para ISAs no virtualizables (en el sentido dado por Popek y Goldberg).
La virtualización de tales arquitecturas requiere el apropiado manejo de las instrucciones críticas, es decir, las instrucciones sensibles pero no priviligiadas. Una aproximación, conocida como patching, adopta técnicas comúnmente utilizadas en recompilación dinámica: las instrucciones críticas son identificadas en tiempo de ejecución y reemplazadas con un trap al VMM. Se han propuesto varios mecanismos para hacer este proceso más eficiente; entre ellos, la asistencia por hardware y el almacenamiento en caché del código de emulación. Una aproximación diferente es la paravirtualización, la cual requiere que el sistema operativo huésped sea modificado (portado) antes de ser ejecutado en el entorno virtual.