Partager via


Types de données

Valeurs réservées

Cette spécification indique que certains champs sont « réservés ». Ces champs peuvent avoir une signification spécifique dans les versions futures de l’architecture de l’hyperviseur. Pour une compatibilité ascendante maximale, les clients de l’interface d’hyperviseur doivent suivre les instructions fournies dans ce document. En général, deux formes d’aide sont fournies. Conserver la valeur (documentée en tant que RsvdP dans les diagrammes et ReservedP dans les segments de code) : pour une compatibilité ascendante maximale, les clients doivent conserver la valeur dans ce champ. Cela se fait généralement en lisant la valeur actuelle, en modifiant les valeurs des champs non réservés et en réécritant la valeur. Valeur zéro (documentée en tant que RsvdZ dans les diagrammes et ReservedZ dans les segments de code) : pour une compatibilité ascendante maximale, les clients doivent zéro la valeur dans ce champ.

Les champs réservés dans les structures en lecture seule sont simplement documentés en tant que Rsvd dans les diagrammes et simplement en tant que réservés dans les segments de code. Pour une compatibilité ascendante maximale, les valeurs de ces champs doivent être ignorées. Les clients ne doivent pas supposer que ces valeurs seront toujours égales à zéro.

Types scalaires simples

Les types de données d’hyperviseur sont créés à partir de types scalaires simples UINT8, UINT16, UINT32, UINT64 et UINT128. Chacun de ces éléments représente un scalaire d’entier non signé simple avec le nombre de bits spécifié. Plusieurs scalaires d’entiers signés correspondants sont également définis : INT8, INT16, INT32 et INT64. L’hyperviseur n’utilise ni instructions à virgule flottante ni types de virgule flottante.

Code d’état Hypercall

Chaque hypercall retourne un code d’état 16 bits de type HV_STATUS.

typedef UINT16 HV_STATUS;

Types d’espace d’adressage mémoire

L’architecture de l’hyperviseur définit trois espaces d’adressage indépendants :

  • Les adresses physiques système (SPA) définissent l’espace d’adressage physique du matériel sous-jacent, tel qu’il est vu par les processeurs. Il n’y a qu’un seul espace d’adressage physique système pour l’ensemble de la machine.
  • Les adresses physiques invitées définissent la vue de la mémoire physique de l’invité. Les objets de stratégie de groupe peuvent être mappés à des spAs sous-jacents. Il existe un espace d’adressage physique invité par partition.
  • Les adresses virtuelles invitées (VGA) sont utilisées dans l’invité lorsqu’il active la traduction d’adresses et fournit une table de page invité valide.

Ces trois espaces d’adressage ont une taille maximale de 264 octets. Les types suivants sont ainsi définis :

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

De nombreuses interfaces d’hyperviseur agissent sur des pages de mémoire plutôt que sur des octets simples. La taille de page minimale dépend de l’architecture. Pour x64, il est défini comme 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

Pour convertir un en HV_SPAHV_SPA_PAGE_NUMBER, divisez simplement par HV_PAGE_SIZE.

Structures, énumérations et champs de bits

De nombreuses structures de données et valeurs constantes définies plus loin dans cette spécification sont définies en termes d’énumérations et de structures de style C. Le langage C évite volontairement de définir certains détails d’implémentation. Toutefois, ce document suppose ce qui suit :

  • Toutes les énumérations déclarées avec le mot clé « enum » définissent des valeurs entières signées 32 bits.
  • Toutes les structures sont remplies de manière à ce que les champs soient alignés naturellement (c’est-à-dire qu’un champ de 8 octets est aligné sur un décalage de 8 octets, etc.).
  • Tous les champs de bits sont emballés des bits d’ordre inférieur aux bits d’ordre élevé sans remplissage.

Endianness

L’interface d’hyperviseur est conçue pour être neutre en endian (autrement dit, il devrait être possible de porter l’hyperviseur vers un système big-endian ou little-endian), mais certaines des structures de données définies plus loin dans cette spécification supposent une disposition little-endian. Ces structures de données devront être modifiées si et quand un port big-endian est tenté.

Convention d’affectation de noms de pointeur

Le document utilise une convention d’affectation de noms pour les types de pointeurs. En particulier, un « P » ajouté à un type défini indique un pointeur vers ce type. Un « PC » ajouté à un type défini indique un pointeur vers une valeur constante de ce type.