Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Valores Reservados
Essa especificação documenta alguns campos como "reservados". Esses campos podem receber um significado específico em versões futuras da arquitetura do hipervisor. Para obter a compatibilidade máxima, os clientes da interface do hipervisor devem seguir as diretrizes fornecidas neste documento. Em geral, duas formas de orientação são fornecidas. Preservar valor (documentado como RsvdP em diagramas e ReservedP em segmentos de código) – para compatibilidade máxima, os clientes devem preservar o valor dentro desse campo. Isso normalmente é feito lendo o valor atual, modificando os valores dos campos não reservados e gravando o valor de volta. Valor zero (documentado como RsvdZ em diagramas e ReservedZ em segmentos de código) – para compatibilidade máxima com encaminhamento, os clientes devem zero o valor dentro desse campo.
Os campos reservados dentro de estruturas somente leitura são simplesmente documentados como Rsvd em diagramas e simplesmente como Reservados em segmentos de código. Para compatibilidade máxima com encaminhamento, os valores dentro desses campos devem ser ignorados. Os clientes não devem assumir que esses valores sempre serão zero.
Tipos escalares simples
Os tipos de dados do hipervisor são criados com base em tipos escalares simples UINT8, UINT16, UINT32, UINT64 e UINT128. Cada um deles representa um simples escalar inteiro sem sinal com a contagem de bits especificada. Vários escalares de inteiros com sinal correspondentes também são definidos: INT8, INT16, INT32 e INT64. O hipervisor não usa instruções de ponto flutuante nem tipos de ponto flutuante.
Código de status de hiperchamada
Cada hiperchamada retorna um código de status de 16 bits do tipo HV_STATUS.
typedef UINT16 HV_STATUS;
Tipos de espaço de endereço de memória
A arquitetura do hipervisor define três espaços de endereço independentes:
- Os SPAs (endereços físicos do sistema) definem o espaço de endereço físico do hardware subjacente, conforme visto pelas CPUs. Há apenas um espaço de endereço físico do sistema para todo o computador.
- Os GPAs (endereços físicos convidados) definem a exibição da memória física do convidado. Os GPAs podem ser mapeados para SPAs subjacentes. Há um espaço de endereço físico convidado por partição.
- Os GVAs (endereços virtuais convidados) são usados dentro do convidado quando ele habilita a tradução de endereços e fornece uma tabela de página de convidado válida.
Todos esses três espaços de endereço têm até 264 bytes de tamanho. Assim, os seguintes tipos são definidos:
typedef UINT64 HV_SPA;
typedef UINT64 HV_GPA;
typedef UINT64 HV_GVA;
Muitas interfaces de hipervisor atuam em páginas de memória em vez de bytes únicos. O tamanho mínimo da página depende da arquitetura. Para x64, ele é definido 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
Para converter um HV_SPA em um HV_SPA_PAGE_NUMBER, basta dividir por HV_PAGE_SIZE.
Estruturas, enumerações e campos de bit
Muitas estruturas de dados e valores constantes definidos posteriormente nesta especificação são definidos em termos de enumerações e estruturas de estilo C. A linguagem C evita definir determinados detalhes de implementação. No entanto, este documento pressupõe o seguinte:
- Todas as enumerações declaradas com a palavra-chave "enum" definem valores inteiros com sinal de 32 bits.
- Todas as estruturas são preenchidas de forma que os campos sejam alinhados naturalmente (ou seja, um campo de 8 bytes é alinhado a um deslocamento de 8 bytes e assim por diante).
- Todos os campos de bits são empacotados de bits de baixa ordem para de alta ordem sem preenchimento.
Endianness
A interface do hipervisor foi projetada para ser neutra para endian (ou seja, deve ser possível portar o hipervisor para um sistema big-endian ou little-endian), mas algumas das estruturas de dados definidas posteriormente nesta especificação pressupõem o layout little-endian. Essas estruturas de dados precisarão ser alteradas se e quando uma porta big endian for tentada.
Convenção de nomenclatura de ponteiro
O documento usa uma convenção de nomenclatura para tipos de ponteiro. Em particular, um "P" anexado a um tipo definido indica um ponteiro para esse tipo. Um "PC" anexado a um tipo definido indica um ponteiro para um valor constante desse tipo.