Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta sección se describe cómo el software invitado detecta la presencia de un hipervisor y consulta sus funcionalidades, características e información de versión mediante mecanismos de detección específicos de la arquitectura.
Detección de características e interfaces (x64)
El software invitado interactúa con el hipervisor a través de una variedad de mecanismos. Muchos de estos reflejan los mecanismos tradicionales utilizados por el software para interactuar con el procesador subyacente. Por lo tanto, estos mecanismos son específicos de la arquitectura. En la arquitectura x64, se usan los siguientes mecanismos:
- Instrucción CPUID: se usa para la información estática de características y versiones.
- MSR (registros específicos del modelo): se usa para los valores de estado y control.
- Registros asignados a memoria: se usa para los valores de estado y control.
- Interrupciones del procesador: se usa para eventos asincrónicos, notificaciones y mensajes.
Además de estas interfaces específicas de la arquitectura, el hipervisor proporciona una interfaz de procedimientos sencilla implementada con hiperllamadas.
Detección de hipervisores
Antes de usar cualquier interfaz de hipervisor, el software debe determinar primero si se ejecuta dentro de un entorno virtualizado. En plataformas x64 que se ajustan a esta especificación, esto se realiza ejecutando la instrucción CPUID con un valor de entrada (EAX) de 1. Tras la ejecución, el código debe comprobar el bit 31 del registro ECX (el "hipervisor presente bit"). Si se establece este bit, hay un hipervisor presente. En un entorno no virtualizado, el bit estará claro.
CPUID.01h.ECX:31 // if set, virtualization present
Si se establece el "bit presente del hipervisor", se pueden consultar hojas adicionales de CPUID para obtener más información sobre el hipervisor conforme y sus funcionalidades. Se garantiza que dos hojas de este tipo están disponibles: 0x40000000 y 0x40000001. Las hojas numeradas posteriormente también pueden estar disponibles.
Hojas de CPUID del hipervisor estándar
Cuando se consulta la hoja en 0x40000000 , el hipervisor devolverá información que proporciona el número de hoja de CPUID máximo del hipervisor y una firma de identificador de proveedor.
| Register | Información proporcionada |
|---|---|
| EAX | Valor de entrada máximo para la información de CPUID del hipervisor |
| EBX | Firma de identificador de proveedor de hipervisor |
| ECX | Firma de identificador de proveedor de hipervisor |
| EDX | Firma de identificador de proveedor de hipervisor |
Si se consulta la hoja en 0x40000001 , devolverá un valor que representa una identificación de la interfaz de hipervisor neutral del proveedor. Esto determina la semántica de las hojas de a través 0x4000002de 0x400000FF .
| Register | Información proporcionada |
|---|---|
| EAX | Firma de interfaz de hipervisor. |
| EBX | Reservado |
| ECX | Reservado |
| EDX | Reservado |
Estas dos hojas permiten al invitado consultar el identificador del proveedor del hipervisor e interfaz de forma independiente. El identificador del proveedor solo se proporciona con fines informativos y de diagnóstico. Se recomienda que el software solo base las decisiones de compatibilidad en la firma de interfaz notificadas a través de la hoja 0x40000001.
Hojas de CPUID del hipervisor de Microsoft
En los hipervisores que se ajustan a la interfaz CPUID del hipervisor de Microsoft, los 0x40000000 registros hoja y 0x40000001 tendrán los valores siguientes.
Intervalo hoja de CPUID del hipervisor: 0x40000000
EAX determina la hoja de CPUID máxima del hipervisor. EBX-EDX contienen la firma del identificador de proveedor del hipervisor. La firma del identificador de proveedor solo debe usarse con fines de informes y diagnóstico.
| Register | Información proporcionada |
|---|---|
| EAX | Valor de entrada máximo para la información de CPUID del hipervisor. En hipervisores de Microsoft, será al menos 0x40000005. |
| EBX | 0x7263694D: "Micr" |
| ECX | 0x666F736F: "osof" |
| EDX | 0x76482074: "t Hv" |
Identificación de la interfaz neutral del proveedor del hipervisor: 0x40000001
EAX contiene la firma de identificación de la interfaz del hipervisor. Esto determina la semántica de las hojas de a través 0x40000002de 0x400000FF .
| Register | Información proporcionada |
|---|---|
| EAX | 0x31237648: "Hv#1" |
| EBX | Reservado |
| ECX | Reservado |
| EDX | Reservado |
Los hipervisores que se ajustan a la interfaz "Hv#1" también proporcionan al menos las hojas siguientes.
Identidad del sistema de hipervisor: 0x40000002
| Register | bits | Información proporcionada |
|---|---|---|
| EAX | Número de compilación | |
| EBX | 31-16 | Versión Principal |
| 15-0 | Versión Menor |
Identificación de características de hipervisor: 0x40000003
EAX y EBX indican qué características están disponibles para la partición en función de los privilegios de partición actuales.
| Register | bits | Información proporcionada |
|---|---|---|
| EAX | Corresponde a bits 31-0 de HV_PARTITION_PRIVILEGE_MASK | |
| EBX | Corresponde a bits de 63 a 32 de HV_PARTITION_PRIVILEGE_MASK | |
| ECX | 4-0 | Reservado |
| 5 | Mperf invariable está disponible | |
| 6 | La pila de sombras del supervisor está disponible | |
| 7 | La PMU arquitectónica está disponible | |
| 8 | La interceptación de captura de excepciones está disponible | |
| 31-9 | Reservado | |
| EDX | 0 | En desuso (anteriormente indicado la disponibilidad de la instrucción MWAIT) |
| 1 | La compatibilidad con la depuración de invitados está disponible | |
| 2 | La compatibilidad con el Monitor de rendimiento está disponible | |
| 3 | La compatibilidad con eventos de creación de particiones dinámicas de CPU física está disponible | |
| 4 | La compatibilidad con el paso del bloque de parámetros de entrada de hiperllamada a través de registros XMM está disponible. | |
| 5 | La compatibilidad con un estado de inactividad de invitado virtual está disponible | |
| 6 | La compatibilidad con el estado de suspensión del hipervisor está disponible | |
| 7 | La compatibilidad con la consulta de distancias NUMA está disponible | |
| 8 | La compatibilidad con la determinación de frecuencias del temporizador está disponible | |
| 9 | La compatibilidad con la inserción de comprobaciones de máquinas sintéticas está disponible | |
| 10 | La compatibilidad con MSR de bloqueo de invitado está disponible | |
| 11 | La compatibilidad con MSR de depuración está disponible | |
| 12 | La compatibilidad con NPIEP está disponible | |
| 13 | DisableHypervisorAvailable | |
| 14 | ExtendedGvaRangesForFlushVirtualAddressListAvailable | |
| 15 | La compatibilidad con la devolución de la salida de hiperllamada a través de registros XMM está disponible | |
| 16 | Reservado | |
| 17 | SintPollingModeAvailable | |
| 18 | HypercallMsrLockAvailable | |
| 19 | Uso de temporizadores sintéticos directos | |
| 20 | Compatibilidad con el registro pat disponible para VSM | |
| Veintiuno | Compatibilidad con el registro de bndcfgs disponible para VSM | |
| 22 | Reservado | |
| 23 | Compatibilidad con temporizadores sintéticos sin inhalar disponibles | |
| 25-24 | Reservado | |
| 26 | Característica de último registro de rama (LBR) de Intel compatible | |
| 31-27 | Reservado |
Recomendaciones de implementación: 0x40000004
Indica los comportamientos que el hipervisor recomienda que el sistema operativo implemente para obtener un rendimiento óptimo.
| Register | bits | Información proporcionada |
|---|---|---|
| EAX | 0 | Se recomienda usar hypercall para conmutadores de espacio de direcciones en lugar de MOV a instrucción CR3. |
| 1 | Se recomienda usar hypercall para vaciados de TLB locales en lugar de instrucciones INVLPG o MOV a CR3. | |
| 2 | Se recomienda usar hypercall para vaciados de TLB remotos en lugar de interrupciones entre procesadores. | |
| 3 | Se recomienda usar MSR para acceder a los registros de APIC EOI, ICR y TPR en lugar de sus homólogos asignados a memoria. | |
| 4 | Se recomienda usar el MSR proporcionado por el hipervisor para iniciar un RESET del sistema. | |
| 5 | Se recomienda usar el tiempo relajado para esta partición. Si se usa, la máquina virtual debe deshabilitar los tiempos de espera del guardián que dependen de la entrega oportuna de interrupciones externas. | |
| 6 | Se recomienda usar la reasignación de DMA. | |
| 7 | Se recomienda usar la reasignación de interrupciones. | |
| 8 | Reservado. | |
| 9 | Se recomienda dejar de usar AutoEOI. | |
| 10 | Se recomienda usar hypercall syntheticClusterIpi. | |
| 11 | Se recomienda usar la interfaz ExProcessorMasks más reciente. | |
| 12 | Indica que el hipervisor está anidado dentro de una partición de Hyper-V. | |
| 13 | Se recomienda usar INT para llamadas del sistema MBEC. | |
| 14 | Se recomienda un hipervisor anidado mediante la interfaz vmCS habilitada. También indica que las iluminaciones anidadas adicionales pueden estar disponibles (consulte 0x4000000A hoja). | |
| 15 | UseSyncedTimeline: indica que la partición debe consumir el sesgo QueryPerformanceCounter proporcionado por la partición raíz. | |
| 16 | Reservado | |
| 17 | UseDirectLocalFlushEntire: indica que el invitado debe alternar CR4. PGE para vaciar todo el TLB, ya que esto es más eficaz que hacer una hiperllamada. | |
| 18 | NoNonArchitecturalCoreSharing: indica que no es posible compartir núcleos. Esto se puede usar como una optimización para evitar la sobrecarga de rendimiento de STIBP. | |
| 31-19 | Reservado | |
| EBX | Número recomendado de intentos de reintentar un error de bloqueo por subproceso antes de notificar al hipervisor sobre los errores. 0xFFFFFFFF indica que nunca se notifica. | |
| ECX | 6-0 | ImplementedPhysicalAddressBits: informa del ancho de dirección física (MAXPHYADDR) notificado por los procesadores físicos del sistema. Si todos los bits contienen 0, no se admite la característica. Tenga en cuenta que el valor notificado es el número real de bits de dirección física y no la posición de bits utilizada para representar ese número. |
| 31-7 | Reservado | |
| EDX | Reservado |
Límites de implementación del hipervisor: 0x40000005
Describe los límites de escala admitidos en la implementación actual del hipervisor. Si algún valor es cero, el hipervisor no expone la información correspondiente; de lo contrario, tienen estos significados.
| Register | Información proporcionada |
|---|---|
| EAX | Número máximo de procesadores virtuales admitidos |
| EBX | Número máximo de procesadores lógicos admitidos |
| ECX | El número máximo de vectores de interrupción físicos disponibles para la reasignación de interrupciones. |
| EDX | Reservado |
Características de hardware de implementación: 0x40000006
Indica qué características específicas del hardware se han detectado y están actualmente en uso por el hipervisor.
| Register | bits | Información proporcionada |
|---|---|---|
| EAX | 0 | La compatibilidad con la asistencia de superposición de APIC se detecta y está en uso. |
| 1 | Se detecta y usa la compatibilidad con mapas de bits de MSR. | |
| 2 | Se detecta y usa compatibilidad con contadores de rendimiento arquitectónicos. | |
| 3 | La compatibilidad con la traducción de direcciones de segundo nivel se detecta y está en uso. | |
| 4 | La compatibilidad con la reasignación de DMA se detecta y se usa. | |
| 5 | Se detecta la compatibilidad con la reasignación de interrupciones y en uso. | |
| 6 | Indica que hay una limpieza de patrulla de memoria en el hardware. | |
| 7 | La protección contra DMA está en uso. | |
| 8 | Se solicita HPET. | |
| 9 | Los temporizadores sintéticos son volátiles. | |
| 13-10 | Nivel de hipervisor del invitado actual: "0" si no está anidado. | |
| 14 | Modo de destino físico necesario. | |
| 15 | Use VMFUNC para el modificador de mapa de alias. | |
| 16 | La compatibilidad con la creación de ceros de memoria de hardware está presente. | |
| 17 | La compatibilidad con invitado no restringido está presente. | |
| 18 | La compatibilidad con la asignación de recursos (RDT-A, PQOS-A) está presente. | |
| 19 | La compatibilidad con la supervisión de recursos (RDT-M, PQOS-M) está presente. | |
| 20 | La compatibilidad con la PMU virtual invitada está presente. | |
| Veintiuno | La compatibilidad con LBR virtual invitado está presente. | |
| 22 | La compatibilidad con IPT virtual invitado está presente. | |
| 23 | La compatibilidad con la emulación de APIC está presente. | |
| veinticuatro | El hipervisor detecta y usa la tabla WDAT ACPI. | |
| 31-25 | Reservado | |
| EBX | Reservado | |
| ECX | Reservado | |
| EDX | Reservado |
Identificación de características de hipervisor anidadas: 0x40000009
Describe las características expuestas a la partición por el hipervisor al ejecutar anidadas. EAX describe el acceso a las MSR virtuales. EDX describe el acceso a las hiperllamadas.
| Register | bits | Información proporcionada |
|---|---|---|
| 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 |
Características de virtualización anidada del hipervisor: 0x4000000A
Indica qué optimizaciones de virtualización anidadas están disponibles para un hipervisor anidado.
| Register | bits | Información proporcionada |
|---|---|---|
| EAX | 7-0 | Versión habilitada de VMCS (baja) |
| 15-8 | Versión habilitada de VMCS (alta) | |
| 16 | Reservado | |
| 17 | Indica compatibilidad con hiperllamadas de vaciado virtual directo. | |
| 18 | Indica compatibilidad con las hiperllamadas HvCallFlushGuestPhysicalAddressSpace y HvCallFlushGuestPhysicalAddressList (en plataformas x64). | |
| 19 | Indica la compatibilidad con el uso de un mapa de bits de MSR optimizado. | |
| 20 | Indica la compatibilidad con la combinación de excepciones de virtualización en la clase de excepción de error de página. | |
| Veintiuno | Indica la compatibilidad con el valor distinto de cero del campo 0x00002802 (GuestIa32DebugCtl) en VMCS. | |
| 22 | Indica compatibilidad con el TLB optimizado en plataformas AMD. Los vaciados de ASID no afectan a las entradas de TLB derivadas del TPS. Las hiperllamadas deben usarse para invalidar las entradas TLB de HYPER-AND. También indica compatibilidad con las hiperllamadas HvCallFlushGuestPhysicalAddressSpace y HvCallFlushGuestPhysicalAddressList. | |
| 31-21 | Reservado | |
| EBX | 0 | Indica la compatibilidad con los campos GuestPerfGlobalCtrl y HostPerfGlobalCtrl en vmCS habilitadas. |
| 31-1 | Reservado | |
| ECX | Reservado | |
| EDX | Reservado |
Versionamiento
La información de la versión del hipervisor está codificada en hoja 0x40000002. Se proporcionan dos números de versión: la versión principal y la versión del servicio.
La versión principal incluye un número de versión principal y secundaria y un número de compilación. Estos corresponden a los números de versión de Microsoft Windows. La versión del servicio describe los cambios realizados en la versión principal.
Se recomienda encarecidamente que los clientes comprueben las características del hipervisor mediante el uso de hojas 0x40000003 de CPUID en 0x40000005 lugar de comparar con intervalos de versiones.
Detección de características e interfaz (ARM64)
En la arquitectura ARM64, se usan los siguientes mecanismos para la detección de características e interfaces:
- Consultas HvRegister a través de HvCallGetVpRegisters : se usa para la información estática de características y versiones.
- Registros asignados a memoria: se usa para los valores de estado y control.
Además de estas interfaces específicas de la arquitectura, el hipervisor proporciona una interfaz de procedimientos sencilla implementada con hiperllamadas.
Detección de hipervisores
Antes de usar la mayoría de las interfaces del hipervisor, el software debe determinar primero si se ejecuta dentro de un entorno virtualizado.
En ARM64, el software invitado puede detectar el hipervisor mediante la interfaz estándar SMCCC (Convención de llamada de SMC). La detección se realiza mediante la instrucción HVC o SMC con el identificador 0xC600FF0 de función en X0 (esto corresponde a una llamada de hipervisor específica del proveedor de 64 bits, VENDOR_HYP_FUNCTION_CODE_UID). La llamada sigue las convenciones SMCCC, incluida una imm16 de 0. El hipervisor de Microsoft devuelve los siguientes valores que representan GUID 4d32ba58-cd24-4764-8eef-6c7516597024:
| Register | Importancia |
|---|---|
| X0 | 0x4d32ba58 |
| X1 | 0xcd244764 |
| X2 | 0x8eef6c75 |
| X3 | 0x16597024 |
Una vez detectado un hipervisor, el software invitado puede consultar las funcionalidades del hipervisor mediante registros sintéticos mediante el hiperllamada HvCallGetVpRegisters . Se pueden consultar varios registros de claves antes de establecer el registro del identificador del sistema operativo invitado, lo que permite la detección temprana de las características del hipervisor durante el arranque.
Registros de características del hipervisor
Las plataformas ARM64 consultan información del hipervisor a través de registros sintéticos en lugar de instrucciones de CPUID. Estos registros proporcionan información equivalente a sus homólogos de CPUID x64 y se accede a ellos a través de HvCallGetVpRegisters. Todos los registros de características devuelven valores de 128 bits.
Identidad del sistema del hipervisor: HvRegisterHypervisorVersion
Devuelve la información de versión codificada en un valor de 128 bits. El diseño es idéntico al 0x40000002 hoja de CPUID x64, con valores de registro x64 empaquetados en el resultado de 128 bits (EAX en bits 31-0, EBX en bits 63-32, ECX en bits 95-64, EDX en bits 127-96).
Identificación de características del hipervisor: HvRegisterPrivilegesAndFeaturesInfo
Equivalente a 0x40000003 hoja de CPUID x64. Indica qué características están disponibles para la partición en función de los privilegios de partición actuales. Devuelve un valor de 128 bits con estos campos:
| bits | Información proporcionada |
|---|---|
| 31-0 | Corresponde a bits 31-0 de HV_PARTITION_PRIVILEGE_MASK |
| 63-32 | Corresponde a bits de 63 a 32 de HV_PARTITION_PRIVILEGE_MASK |
| 64 | La compatibilidad con la depuración de invitados está disponible. |
| 65 | La compatibilidad con el Monitor de rendimiento está disponible. |
| 66 | La compatibilidad con eventos de creación de particiones dinámicas de CPU física está disponible. |
| 67 | La compatibilidad con un estado de inactividad de invitado virtual está disponible. |
| 68 | La compatibilidad con el estado de suspensión del hipervisor está disponible. |
| 69 | La compatibilidad con la consulta de distancias NUMA está disponible. |
| 70 | La compatibilidad con la determinación de frecuencias del temporizador está disponible. |
| 71 | La compatibilidad con la inserción de comprobaciones de máquinas sintéticas está disponible. |
| 72 | La compatibilidad con los registros de bloqueos de invitado está disponible. |
| 73 | Reservado. |
| 74 | DisableHypervisorAvailable. |
| 75 | Reservado. |
| 76 | SintPollingModeAvailable. |
| 77 | Use temporizadores sintéticos directos. |
| 127-78 | Reservado. |
Recomendaciones de implementación: HvRegisterFeaturesInfo
Equivalente a 0x40000004 hoja de CPUID x64. Indica los comportamientos que el hipervisor recomienda que el sistema operativo implemente para obtener un rendimiento óptimo. Devuelve un valor de 128 bits.
| bits | Información proporcionada |
|---|---|
| 0 | UseHvRegisterForReset: en ARM64, siempre es false (las particiones deben usar PSCI SYSTEM_RESET en su lugar). |
| 1 | Se recomienda usar el tiempo relajado para esta partición. Si se usa, la máquina virtual debe deshabilitar los tiempos de espera del guardián que dependen de la entrega oportuna de interrupciones externas. |
| 2 | Se recomienda usar hypercall syntheticClusterIpi. En ARM64, esto es false para la partición raíz (que debe usar ICC_SGI1R_EL1 directamente) y true para las particiones invitadas. |
| 3 | Se recomienda usar la interfaz ExProcessorMasks más reciente. |
| 4 | Indica que el hipervisor está anidado dentro de una partición de Hyper-V. |
| 5 | Indica que la partición debe consumir el sesgo QueryPerformanceCounter proporcionado por la partición raíz. |
| 20-6 | Reservado |
| Veintiuno | UseHypercallForMmioAccess |
| 22 | UseGpaPinningHypercall |
| 23 | WakeVps |
| 25-24 | Reservado |
| 26 | MapPartitionEventLogBuffer |
| 31-27 | Reservado |
| 63-32 | Número recomendado de intentos de reintentar un error de bloqueo por subproceso antes de notificar al hipervisor sobre los errores. 0xFFFFFFFF indica que nunca se notifica. |
| 127-64 | Reservado |
Límites de implementación del hipervisor: HvRegisterImplementationLimitsInfo
Describe los límites de escala admitidos en la implementación actual del hipervisor. Si algún valor es cero, el hipervisor no expone la información correspondiente. Devuelve un valor de 128 bits con un diseño idéntico al 0x40000005 hoja de CPUID x64, con valores de registro x64 empaquetados en el resultado de 128 bits (EAX en bits 31-0, EBX en bits 63-32, ECX en bits 95-64, EDX en bits 127-96).
Características de hardware de implementación: HvRegisterHardwareFeaturesInfo
Equivalente a 0x40000006 hoja de CPUID x64. Indica qué características específicas del hardware se han detectado y están actualmente en uso por el hipervisor. Devuelve un valor de 128 bits.
| bits | Información proporcionada |
|---|---|
| 0 | Se detecta y usa compatibilidad con contadores de rendimiento arquitectónicos. |
| 1 | La compatibilidad con la traducción de direcciones de segundo nivel se detecta y está en uso. |
| 2 | La compatibilidad con la reasignación de DMA se detecta y se usa. |
| 3 | Se detecta la compatibilidad con la reasignación de interrupciones y en uso. |
| 4 | Indica que hay una limpieza de patrulla de memoria en el hardware. |
| 5 | La protección contra DMA está en uso. |
| 6 | Los temporizadores sintéticos son volátiles. |
| 127-7 | Reservado |
Versionamiento
La información de la versión del hipervisor está codificada en HvRegisterHypervisorVersion. El formato coincide con el equivalente x64.