Compartir a través de


Tipo de datos

Valores reservados

Esta especificación documenta algunos campos como "reservados". Estos campos pueden tener un significado específico en versiones futuras de la arquitectura del hipervisor. Para obtener la compatibilidad máxima con reenvío, los clientes de la interfaz del hipervisor deben seguir las instrucciones proporcionadas en este documento. En general, se proporcionan dos formas de orientación. Conservar el valor (documentado como RsvdP en diagramas y ReservedP en segmentos de código): para obtener compatibilidad máxima con el reenvío, los clientes deben conservar el valor dentro de este campo. Normalmente, esto se hace leyendo el valor actual, modificando los valores de los campos no reservados y escribiendo el valor de nuevo. Valor cero (documentado como RsvdZ en diagramas y ReservedZ en segmentos de código): para obtener compatibilidad máxima con el reenvío, los clientes deben cero el valor dentro de este campo.

Los campos reservados dentro de estructuras de solo lectura se documentan simplemente como Rsvd en diagramas y simplemente como Reservado en segmentos de código. Para obtener la compatibilidad máxima con reenvío, se deben omitir los valores de estos campos. Los clientes no deben suponer que estos valores siempre serán cero.

Tipos escalares simples

Los tipos de datos de hipervisor se crean a partir de tipos escalares simples UINT8, UINT16, UINT32, UINT64 y UINT128. Cada uno de estos representa un escalar entero sin signo simple con el recuento de bits especificado. También se definen varios escalares de entero con signo correspondientes: INT8, INT16, INT32 e INT64. El hipervisor no usa instrucciones de punto flotante ni tipos de punto flotante.

Código de estado de hiperllamada

Cada hiperllamada devuelve un código de estado de 16 bits de tipo HV_STATUS.

typedef UINT16 HV_STATUS;

Tipos de espacio de direcciones de memoria

La arquitectura del hipervisor define tres espacios de direcciones independientes:

  • Las direcciones físicas del sistema (SPA) definen el espacio de direcciones físicos del hardware subyacente, tal y como ven las CPU. Solo hay un espacio de direcciones físicas del sistema para toda la máquina.
  • Las direcciones físicas de invitado (GPO) definen la vista de memoria física del invitado. Los GPO se pueden asignar a las SPA subyacentes. Hay un espacio de direcciones físicas de invitado por partición.
  • Las direcciones virtuales de invitado (GVA) se usan dentro del invitado cuando habilita la traducción de direcciones y proporciona una tabla de páginas de invitado válida.

Los tres espacios de direcciones tienen un tamaño de hasta 264 bytes. Por lo tanto, se definen los siguientes tipos:

typedef UINT64 HV_SPA;
typedef UINT64 HV_GPA;
typedef UINT64 HV_GVA;

Muchas interfaces de hipervisor actúan en páginas de memoria en lugar de en bytes únicos. El tamaño mínimo de página depende de la arquitectura. Para x64, se define como 4K.

#define X64_PAGE_SIZE 0x1000

#define HV_X64_MAX_PAGE_NUMBER (MAXUINT64/X64_PAGE_SIZE)
#define HV_PAGE_SIZE X64_PAGE_SIZE
#define HV_LARGE_PAGE_SIZE X64_LARGE_PAGE_SIZE
#define HV_PAGE_MASK (HV_PAGE_SIZE - 1)

typedef UINT64 HV_SPA_PAGE_NUMBER;
typedef UINT64 HV_GPA_PAGE_NUMBER;
typedef UINT64 HV_GVA_PAGE_NUMBER;
typedef UINT32 HV_SPA_PAGE_OFFSET
typedef HV_GPA_PAGE_NUMBER *PHV_GPA_PAGE_NUMBER;

Para convertir un en HV_SPA , HV_SPA_PAGE_NUMBERsimplemente divida por HV_PAGE_SIZE.

Estructuras, enumeraciones y campos de bits

Muchas estructuras de datos y valores constantes definidos más adelante en esta especificación se definen en términos de estructuras y enumeraciones de estilo C. El lenguaje C evita definir determinados detalles de implementación. Sin embargo, en este documento se da por hecho lo siguiente:

  • Todas las enumeraciones declaradas con la palabra clave "enum" definen valores enteros con signo de 32 bits.
  • Todas las estructuras se rellenan de forma que los campos se alinean naturalmente (es decir, un campo de 8 bytes se alinea con un desplazamiento de 8 bytes, etc.).
  • Todos los campos de bits se empaquetan de bits de orden bajo a bits de orden alto sin relleno.

Modos endian

La interfaz del hipervisor está diseñada para ser neutra endian (es decir, debe ser posible portar el hipervisor a un sistema big-endian o little-endian), pero algunas de las estructuras de datos definidas más adelante en esta especificación asumen el diseño little-endian. Estas estructuras de datos deberán modificarse si se intenta y cuando se intenta un puerto big-endian.

Convención de nomenclatura de puntero

El documento usa una convención de nomenclatura para los tipos de puntero. En concreto, una "P" anteponeda a un tipo definido indica un puntero a ese tipo. Un "PC" antepuesto a un tipo definido indica un puntero a un valor constante de ese tipo.