viernes, 16 de enero de 2009

Estructuras de control de la máquina virtual

La estructura de datos de control de la máquina virtual (VMCS) se define en las operaciones VMX. Una VMCS administra transiciones dentro y fuera de operaciones no raíz VMX. Esta estructura está manipulada por las nuevas instrucciones VMCLEAR, VMPTRLD, VMREAD, y VMWRITE. Una VMM puede usar un VMCS diferente por cada máquina virtual que soporte. Para una máquina virtual con varios procesadores lógicos (procesadores virtuales), el VMM puede usar un VMCS diferente para cada procesador virtual (en memoria, cada procesador lógico está asociado a su VMCS en la región VMCS). El software activa un VMCS ejecutando VMPTRLD con la dirección del VMCS, y lo desactiva ejecutando VMCLEAR con la dirección del VMCS. El procesador optimizará la operación VMX manteniendo el estado de una VMCS activa en memoria, en el procesador, o en ambos. No se debe activar varias VMCS en un único procesador lógico.
Los datos VMCS se organizan en seis grupos lógicos:
- Área guest-state: el estado del procesador se guarda en este área en las salidas de la VM y se carga desde aquí en las entradas.
- Área host-state: el estado del procesador se carga desde aquí en las salidas VM.
- Campos de control de ejecución VM: Estos campos controlan el comportamiento del procesador en operación no raíz VMX. Esto determina en parte la causa de las salidas VM.
- Campos de control de salidas VM: Campos que controlan la salida de la VM.
- Campos de control de entradas VM
- Campos de información de salidas VM: Estos campos reciben información de las salidas VM y describen su causa y su naturaleza. Son de sólo lectura.
Estos son los campos de control que gobiernan la ejecución VM:
- Controles de ejecución de la VM basados en pines (NMIs virtuales, salida de interrupciones externas...)
- Controles de ejecución de la VM basados en el procesador (salidas de almacenamiento o de carga CR3, salidas RDPMC...)
- Excepción Bitmap; es un campo de 32 bits que contiene un bit por cada excepción. Si la excepción causa una salida de la VM, el bit correspondiente se pone a uno.
- Direcciones Bitmap de E/S: Los campos de control de ejecución de la VM incluyen direcciones físicas de 64 bits de bitmaps de E/S A y B (que ocupa cada uno 4 KBytes)
- Offset contador de time-stamp: Este campo controla las ejecuciones de las instrucciones RDTSC y RDTSCP.
- Máscaras guest/host y read shadows de CR0 y CR4: Controlan las ejecuciones de instrucciones que acceden a esos registros. Son de 64 bits en procesadores Intel 64 y de 32 bits en procesadores IA-32.
- Controles CR3-target: dependiendo de este campo se producirá o no una salida VM.
- Controles para accesos APIC
- Dirección MSR-bitmap: En los procesadores que soportan el 1-setting de los controles de ejecución de la VM 'use MSR bitmaps', los campos de control incluyen una dirección física de 64 bits un 4 bitmaps MSR contiguos, cada cual ocupa 1 KByte. Este campo no existe en procesadores que no soportan el 1-setting de ese control.
- Puntero de ejecución VMCS: Es un puntero de 64 bits usado en el tratamiento dual-monitor de interrupciones de administración de sistema (SMIs) y en el modo de administración del sistema (SMM).
- Puntero a la tabla de paginación extendida (EPTP): Contiene la dirección de la base de la tabla EPML4, y también la información de configuración EPT.
- Identificador del procesador virtual (VPID): Es un campo de 16 bits y existe sólo en procesadores que soportan 1-setting en el control de ejecución de 'enable VPID'.
Para asegurar un comportamiento bueno del procesador, el software debe seguir unas ciertas pautas a la hora de acceder a un VMCS activo. El software nunca debe acceder o modificar los datos VMCS de una VMCS activa usando operaciones de memoria ordinarias, en parte porque el formato usado para guardar los datos VMCS es específico de cada implementación y no está definido en la arquitectura. Estos problemas se pueden solucionar borrando todos los mapeos de direcciones lineales a una región VMCS antes de ejecutar una VMPTRLD para esa región y no remapeándolo hasta después de ejecutar VMCLEAR. Para acceder a los campos se deben utilizar las instrucciones VMREAD y VMWRITE.
Un procesador puede usar porciones de datos VMCS de una región para mantener la implementación específica de la información sobre la VMCS. Cuando el software primero localiza una región de memoria para usar como región VMCS, los datos en esa región se pueden interpretar de manera específica. Además de otras funciones, la instrucción VMCLEAR inicia cualquier información de implementación específica en una región VMCS referenciada por su operando. Antes de activar un VMCS con VMPTRLD, el software siempre debe ejecutar un VMCLEAR sobre la región VMCS. Un procesador lógico usa la región VMCS para mantener el estado de carga de las correspondientes VMCS. Este estado puede ser borrado o cargado (con VMCLEAR se borra, y con VMLAUNCH se carga). Cuando se carga con VMLAUNCH se requiere también una instrucción VMRESUME. No hay mas formas que ésta para modificar el estado de carga de una VMCS (no se puede modificar con VMWRITE) y no hay forma directa de leerlo (no se puede leer con VMREAD). Si se el software no aconsejado puede dar lugar valores de estado no definidos. El uso del software tiene tres limitaciones:
- VMCLEAR se tiene que ejecutar para un VMCS antes de se use para la entrada VM.
- VMLAUNCH se tiene que usar para la primera entrada a la VM usando un VMCS después de que se haya ejecutado el VMCLEAR.
- VMRESUME se debe usar para cualquier subsecuencia de entrada a la VM usando un VMCS.
Como cabe esperar, en general, VMRESUME tendrá mas latencia que VMLAUNCH.

1 comentario:

Chaz dijo...
Este comentario ha sido eliminado por el autor.