Compartilhar via


Descoberta de recursos e interfaces

Esta seção descreve como o software convidado detecta a presença de um hipervisor e consulta seus recursos, recursos e informações de versão usando mecanismos de descoberta específicos da arquitetura.

Descoberta de recursos e interfaces (x64)

O software convidado interage com o hipervisor por meio de uma variedade de mecanismos. Muitos deles espelham os mecanismos tradicionais usados pelo software para interagir com o processador subjacente. Dessa forma, esses mecanismos são específicos da arquitetura. Na arquitetura x64, os seguintes mecanismos são usados:

  • Instrução CPUID – usada para informações de versão e recursos estáticos.
  • MSRs (registros específicos do modelo) – usados para valores de status e controle.
  • Registros mapeados em memória – usados para valores de status e controle.
  • Interrupções do processador – usadas para eventos assíncronos, notificações e mensagens.

Além dessas interfaces específicas da arquitetura, o hipervisor fornece uma interface de procedimento simples implementada com hiperchamadas.

Descoberta de hipervisor

Antes de usar as interfaces do hipervisor, o software deve primeiro determinar se ele está em execução em um ambiente virtualizado. Em plataformas x64 que estão em conformidade com essa especificação, isso é feito executando a instrução CPUID com um valor de entrada (EAX) de 1. Após a execução, o código deve verificar o bit 31 do registro ECX (o "bit presente do hipervisor"). Se esse bit estiver definido, um hipervisor estará presente. Em um ambiente não virtualizado, o bit será claro.

CPUID.01h.ECX:31 // if set, virtualization present

Se o "bit presente do hipervisor" estiver definido, folhas CPUID adicionais poderão ser consultadas para obter mais informações sobre o hipervisor compatível e suas funcionalidades. Há garantia de que duas dessas folhas estejam disponíveis: 0x40000000 e 0x40000001. As folhas numeradas posteriormente também podem estar disponíveis.

Folhas CPUID do hipervisor padrão

Quando a folha for 0x40000000 consultada, o hipervisor retornará informações que fornecem o número máximo de folha CPUID do hipervisor e uma assinatura de ID do fornecedor.

Registrar-se Informações fornecidas
EAX O valor máximo de entrada para informações de CPUID do hipervisor
EBX Assinatura da ID do fornecedor do hipervisor
ECX Assinatura da ID do fornecedor do hipervisor
EDX Assinatura da ID do fornecedor do hipervisor

Se a folha 0x40000001 for consultada, ela retornará um valor que representa uma identificação de interface de hipervisor neutra do fornecedor. Isso determina a semântica das folhas de 0x4000002 até 0x400000FF.

Registrar-se Informações fornecidas
EAX Assinatura da interface do hipervisor.
EBX Reservado
ECX Reservado
EDX Reservado

Essas duas folhas permitem que o convidado consulte a ID e a interface do fornecedor do hipervisor de forma independente. A ID do fornecedor é fornecida apenas para fins informativos e de diagnóstico. É recomendável que o software apenas basee as decisões de compatibilidade na assinatura de interface relatadas por meio da folha 0x40000001.

Folhas de CPUID do Hipervisor da Microsoft

Em hipervisores em conformidade com a interface CPUID do hipervisor da Microsoft, os 0x40000000 registros folha e folha 0x40000001 terão os seguintes valores.

Intervalo de folhas CPUID do hipervisor – 0x40000000

O EAX determina a folha de CPUID máxima do hipervisor. EBX-EDX contêm a assinatura da ID do fornecedor do hipervisor. A assinatura da ID do fornecedor deve ser usada apenas para fins de relatório e diagnóstico.

Registrar-se Informações fornecidas
EAX O valor máximo de entrada para informações de CPUID do hipervisor. Nos hipervisores da Microsoft, isso será pelo menos 0x40000005.
EBX 0x7263694D— "Micr"
ECX 0x666F736F— "osof"
EDX 0x76482074— "t Hv"

Identificação de interface neutra do fornecedor do hipervisor – 0x40000001

O EAX contém a assinatura de identificação da interface do hipervisor. Isso determina a semântica das folhas de 0x40000002 até 0x400000FF.

Registrar-se Informações fornecidas
EAX 0x31237648— "Hv#1"
EBX Reservado
ECX Reservado
EDX Reservado

Os hipervisores em conformidade com a interface "Hv#1" também fornecem pelo menos as seguintes folhas.

Identidade do sistema do hipervisor – 0x40000002

Registrar-se Bits Informações fornecidas
EAX Número da Compilação
EBX 31-16 Versão Principal
15-0 Versão Menor

Identificação de recursos do hipervisor – 0x40000003

EAX e EBX indicam quais recursos estão disponíveis para a partição com base nos privilégios de partição atuais.

Registrar-se Bits Informações fornecidas
EAX Corresponde aos bits 31-0 de HV_PARTITION_PRIVILEGE_MASK
EBX Corresponde aos bits 63-32 de HV_PARTITION_PRIVILEGE_MASK
ECX 4-0 Reservado
5 O Mperf invariável está disponível
6 A pilha de sombras do supervisor está disponível
7 O PMU de arquitetura está disponível
8 Interceptação de interceptação de exceção está disponível
31-9 Reservado
EDX 0 Preterido (disponibilidade indicada anteriormente da instrução MWAIT)
1 O suporte à depuração de convidado está disponível
2 O suporte ao Monitor de Desempenho está disponível
3 O suporte para eventos de particionamento dinâmico da CPU física está disponível
4 O suporte para passar o bloco de parâmetro de entrada de hiperchamada por meio de registros XMM está disponível
5 O suporte para um estado ocioso de convidado virtual está disponível
6 O suporte para o estado de suspensão do hipervisor está disponível
7 O suporte para consultar distâncias NUMA está disponível
8 O suporte para determinar as frequências do temporizador está disponível
9 O suporte para injetar verificações de máquina sintética está disponível
10 O suporte para MSRs de falha de convidado está disponível
11 O suporte para msrs de depuração está disponível
12 O suporte para NPIEP está disponível
13 DisableHypervisorAvailable
14 ExtendedGvaRangesForFlushVirtualAddressListAvailable
15 O suporte para retornar a saída de hiperchamada por meio de registros XMM está disponível
16 Reservado
17 SintPollingModeAvailable
18 HypercallMsrLockAvailable
19 Usar temporizadores sintéticos diretos
20 Suporte para o registro pat disponível para VSM
21 Suporte para o registro de bndcfgs disponível para VSM
22 Reservado
23 Suporte para tempo sintético não inalado disponível
25-24 Reservado
26 Recurso LBR (Último Registro de Ramificação) da Intel com suporte
31-27 Reservado

Recomendações de implementação – 0x40000004

Indica quais comportamentos o hipervisor recomenda que o sistema operacional implemente para um desempenho ideal.

Registrar-se Bits Informações fornecidas
EAX 0 Recomendamos usar a hiperchamada para comutadores de espaço de endereço em vez de MOV para instrução CR3.
1 É recomendável usar a hiperchamada para liberações de TLB locais em vez de INSTRUÇÕES INVLPG ou MOV para CR3.
2 É recomendável usar a hiperchamada para liberações remotas de TLB em vez de interrupções entre processadores.
3 É recomendável usar MSRs para acessar registros APIC EOI, ICR e TPR em vez de seus equivalentes mapeados em memória.
4 É recomendável usar o MSR fornecido pelo hipervisor para iniciar uma REDEFINIÇÃO do sistema.
5 É recomendável usar o tempo relaxado para essa partição. Se usada, a VM deve desabilitar qualquer tempo limite de watchdog que dependa da entrega oportuna de interrupções externas.
6 É recomendável usar o remapeamento de DMA.
7 É recomendável usar o remapeamento de interrupção.
8 Reservado.
9 Recomendamos a substituição do AutoEOI.
10 É recomendável usar a hiperchamada SyntheticClusterIpi.
11 É recomendável usar a interface ExProcessorMasks mais recente.
12 Indica que o hipervisor está aninhado em uma partição Hyper-V.
13 É recomendável usar o INT para chamadas do sistema MBEC.
14 Recomendamos um hipervisor aninhado usando a interface VMCS habilitada. Também indica que iluminações aninhadas adicionais podem estar disponíveis (consulte folha 0x4000000A).
15 UseSyncedTimeline – Indica que a partição deve consumir o viés QueryPerformanceCounter fornecido pela partição raiz.
16 Reservado
17 UseDirectLocalFlushEntire – Indica que o convidado deve alternar CR4. PGE para liberar todo o TLB, pois isso é mais performante do que fazer uma hiperchamada.
18 NoNonArchitecturalCoreSharing – indica que o compartilhamento principal não é possível. Isso pode ser usado como uma otimização para evitar a sobrecarga de desempenho do STIBP.
31-19 Reservado
EBX Número recomendado de tentativas de tentar novamente uma falha de spinlock antes de notificar o hipervisor sobre as falhas. 0xFFFFFFFF indica nunca notificar.
ECX 6-0 ImplementedPhysicalAddressBits – relata a largura do endereço físico (MAXPHYADDR) relatada pelos processadores físicos do sistema. Se todos os bits contiverem 0, o recurso não terá suporte. Observe que o valor relatado é o número real de bits de endereço físico e não a posição de bit usada para representar esse número.
31-7 Reservado
EDX Reservado

Limites de implementação do hipervisor – 0x40000005

Descreve os limites de escala com suporte na implementação atual do hipervisor. Se qualquer valor for zero, o hipervisor não exporá as informações correspondentes; caso contrário, eles têm esses significados.

Registrar-se Informações fornecidas
EAX O número máximo de processadores virtuais com suporte
EBX O número máximo de processadores lógicos com suporte
ECX O número máximo de vetores de interrupção física disponíveis para remapeamento de interrupção.
EDX Reservado

Recursos de hardware de implementação – 0x40000006

Indica quais recursos específicos de hardware foram detectados e estão atualmente em uso pelo hipervisor.

Registrar-se Bits Informações fornecidas
EAX 0 O suporte para assistência de sobreposição APIC é detectado e em uso.
1 O suporte para bitmaps MSR é detectado e em uso.
2 O suporte para contadores de desempenho de arquitetura é detectado e em uso.
3 O suporte para tradução de endereço de segundo nível é detectado e em uso.
4 O suporte para remapeamento de DMA é detectado e em uso.
5 O suporte para remapeamento de interrupção é detectado e em uso.
6 Indica que um scrubber de patrulha de memória está presente no hardware.
7 A proteção contra DMA está em uso.
8 O HPET é solicitado.
9 Temporizadores sintéticos são voláteis.
13-10 O nível do hipervisor do convidado atual - '0' se não aninhado.
14 Modo de destino físico necessário.
15 Use VMFUNC para o comutador de mapa de alias.
16 O suporte para zero de memória de hardware está presente.
17 O suporte para Convidado Irrestrito está presente.
18 O suporte para alocação de recursos (RDT-A, PQOS-A) está presente.
19 O suporte para monitoramento de recursos (RDT-M, PQOS-M) está presente.
20 O suporte para PMU virtual convidado está presente.
21 O suporte para LBR virtual convidado está presente.
22 O suporte para IPT virtual convidado está presente.
23 O suporte para emulação APIC está presente.
24 A tabela WDAT do ACPI é detectada e em uso pelo hipervisor.
31-25 Reservado
EBX Reservado
ECX Reservado
EDX Reservado

Identificação de recursos aninhados do hipervisor – 0x40000009

Descreve os recursos expostos à partição pelo hipervisor ao executar aninhado. O EAX descreve o acesso a MSRs virtuais. O EDX descreve o acesso a hiperchamadas.

Registrar-se Bits Informações fornecidas
EAX 1-0 Reservado
2 AccessSynicRegs
3 Reservado
4 AccessIntrCtrlRegs
5 AccessHypercallMsrs
6 AccessVpIndex
11-7 Reservado
12 AccessReenlightenmentControls
31-13 Reservado
EBX Reservado
ECX Reservado
EDX 3-0 Reservado
4 XmmRegistersForFastHypercallAvailable
14-5 Reservado
15 FastHypercallOutputAvailable
16 Reservado
17 SintPollingModeAvailable
31-18 Reservado

Recursos de virtualização aninhada do hipervisor – 0x4000000A

Indica quais otimizações de virtualização aninhadas estão disponíveis para um hipervisor aninhado.

Registrar-se Bits Informações fornecidas
EAX 7-0 Versão do VMCS habilitada (baixa)
15-8 Versão do VMCS habilitada (alta)
16 Reservado
17 Indica suporte para hiperchamadas de liberação virtual direta.
18 Indica suporte para as hiperchamas HvCallFlushGuestPhysicalAddressSpace e HvCallFlushGuestPhysicalAddressList (em plataformas x64).
19 Indica suporte para usar um bitmap de MSR habilitado.
20 Indica suporte para combinar exceções de virtualização na classe de exceção de falha de página.
21 Indica suporte para valor diferente de zero do campo 0x00002802 (GuestIa32DebugCtl) no VMCS.
22 Indica suporte para o TLB habilitado em plataformas AMD. As liberações de ASID não afetam as entradas TLB derivadas do NPT. As hiperchamadas devem ser usadas para invalidar entradas TLB NPT. Também indica suporte para as hiperchamas HvCallFlushGuestPhysicalAddressSpace e HvCallFlushGuestPhysicalAddressList.
31-21 Reservado
EBX 0 Indica suporte para os campos GuestPerfGlobalCtrl e HostPerfGlobalCtrl no VMCS habilitado.
31-1 Reservado
ECX Reservado
EDX Reservado

Controle de versão

As informações de versão do hipervisor são codificadas em folha 0x40000002. Dois números de versão são fornecidos: a versão principal e a versão do serviço.

A versão principal inclui um número de versão principal e secundário e um número de build. Elas correspondem aos números de versão do Microsoft Windows. A versão do serviço descreve as alterações feitas na versão principal.

Os clientes são altamente incentivados a verificar se há recursos de hipervisor usando folhas 0x400000030x40000005 de CPUID em vez de comparar com intervalos de versão.

Descoberta de recursos e interfaces (ARM64)

Na arquitetura ARM64, os seguintes mecanismos são usados para descoberta de recursos e interface:

  • Consultas HvRegister por meio de HvCallGetVpRegisters – Usado para informações de recursos estáticos e de versão.
  • Registros mapeados em memória – usados para valores de status e controle.

Além dessas interfaces específicas da arquitetura, o hipervisor fornece uma interface de procedimento simples implementada com hiperchamadas.

Descoberta de hipervisor

Antes de usar a maioria das interfaces do hipervisor, o software deve primeiro determinar se ele está em execução em um ambiente virtualizado.

No ARM64, o software convidado pode descobrir o hipervisor usando a interface padrão SMCCC (Convenção de Chamada do SMC). A descoberta é executada usando a instrução HVC ou SMC com a ID 0xC600FF0 da função em X0 (isso corresponde a uma chamada de hipervisor específica do fornecedor de 64 bits, VENDOR_HYP_FUNCTION_CODE_UID). A chamada segue as convenções do SMCCC, incluindo um imm16 de 0. O hipervisor da Microsoft retorna os seguintes valores que representam GUID 4d32ba58-cd24-4764-8eef-6c7516597024:

Registrar-se Value
X0 0x4d32ba58
X1 0xcd244764
X2 0x8eef6c75
X3 0x16597024

Depois que um hipervisor é detectado, o software convidado pode consultar recursos de hipervisor por meio de registros sintéticos usando a hiperchamada HvCallGetVpRegisters . Vários registros de chave podem ser consultados antes que o registro de ID do sistema operacional convidado seja definido, permitindo a descoberta antecipada de recursos do hipervisor durante a inicialização.

Registros de recursos do hipervisor

As plataformas ARM64 consultam informações do hipervisor por meio de registros sintéticos em vez de instruções de CPUID. Esses registros fornecem informações equivalentes a seus equivalentes de CPUID x64 e são acessados por meio de HvCallGetVpRegisters. Todos os registros de recursos retornam valores de 128 bits.

Identidade do sistema do hipervisor – HvRegisterHypervisorVersion

Retorna informações de versão codificadas em um valor de 128 bits. O layout é idêntico ao 0x40000002 folha CPUID x64, com valores de registro x64 empacotados no resultado de 128 bits (EAX nos bits 31-0, EBX em bits 63-32, ECX em bits 95-64, EDX em bits 127-96).

Identificação de recursos do hipervisor – HvRegisterPrivilegesAndFeaturesInfo

Equivalente a 0x40000003 folha CPUID x64. Indica quais recursos estão disponíveis para a partição com base nos privilégios de partição atuais. Retorna um valor de 128 bits com estes campos:

Bits Informações fornecidas
31-0 Corresponde aos bits 31-0 de HV_PARTITION_PRIVILEGE_MASK
63-32 Corresponde aos bits 63-32 de HV_PARTITION_PRIVILEGE_MASK
64 O suporte à depuração de convidado está disponível.
65 O suporte ao Monitor de Desempenho está disponível.
66 O suporte para eventos de particionamento dinâmico da CPU física está disponível.
67 O suporte para um estado ocioso de convidado virtual está disponível.
68 O suporte para o estado de suspensão do hipervisor está disponível.
69 O suporte para consultar distâncias NUMA está disponível.
70 O suporte para determinar as frequências do temporizador está disponível.
71 O suporte para injetar verificações de máquina sintética está disponível.
Setenta e dois O suporte para registros de falha de convidado está disponível.
73 Reservado.
74 DisableHypervisorAvailable.
75 Reservado.
76 SintPollingModeAvailable.
77 Use temporizadores sintéticos diretos.
127-78 Reservado.

Recomendações de implementação – HvRegisterFeaturesInfo

Equivalente a 0x40000004 folha CPUID x64. Indica quais comportamentos o hipervisor recomenda que o sistema operacional implemente para um desempenho ideal. Retorna um valor de 128 bits.

Bits Informações fornecidas
0 UseHvRegisterForReset – No ARM64, isso é sempre falso (as partições devem usar SYSTEM_RESET PSCI).
1 É recomendável usar o tempo relaxado para essa partição. Se usada, a VM deve desabilitar qualquer tempo limite de watchdog que dependa da entrega oportuna de interrupções externas.
2 É recomendável usar a hiperchamada SyntheticClusterIpi. No ARM64, isso é falso para a partição raiz (que deve usar ICC_SGI1R_EL1 diretamente) e true para partições de convidado.
3 É recomendável usar a interface ExProcessorMasks mais recente.
4 Indica que o hipervisor está aninhado em uma partição Hyper-V.
5 Indica que a partição deve consumir o viés QueryPerformanceCounter fornecido pela partição raiz.
20-6 Reservado
21 UseHypercallForMmioAccess
22 UseGpaPinningHypercall
23 WakeVps
25-24 Reservado
26 MapPartitionEventLogBuffer
31-27 Reservado
63-32 Número recomendado de tentativas de tentar novamente uma falha de spinlock antes de notificar o hipervisor sobre as falhas. 0xFFFFFFFF indica nunca notificar.
127-64 Reservado

Limites de implementação do hipervisor – HvRegisterImplementationLimitsInfo

Descreve os limites de escala com suporte na implementação atual do hipervisor. Se qualquer valor for zero, o hipervisor não exporá as informações correspondentes. Retorna um valor de 128 bits com um layout idêntico à folha de CPUID x64 0x40000005, com valores de registro x64 empacotados no resultado de 128 bits (EAX nos bits 31-0, EBX nos bits 63-32, ECX nos bits 95-64, EDX nos bits 127-96).

Recursos de hardware de implementação – HvRegisterHardwareFeaturesInfo

Equivalente a 0x40000006 folha CPUID x64. Indica quais recursos específicos de hardware foram detectados e estão atualmente em uso pelo hipervisor. Retorna um valor de 128 bits.

Bits Informações fornecidas
0 O suporte para contadores de desempenho de arquitetura é detectado e em uso.
1 O suporte para tradução de endereço de segundo nível é detectado e em uso.
2 O suporte para remapeamento de DMA é detectado e em uso.
3 O suporte para remapeamento de interrupção é detectado e em uso.
4 Indica que um scrubber de patrulha de memória está presente no hardware.
5 A proteção contra DMA está em uso.
6 Temporizadores sintéticos são voláteis.
127-7 Reservado

Controle de versão

As informações de versão do hipervisor são codificadas em HvRegisterHypervisorVersion. O formato corresponde ao equivalente x64.