Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette section décrit comment le logiciel invité détecte la présence d’un hyperviseur et interroge ses fonctionnalités, fonctionnalités et informations de version à l’aide de mécanismes de découverte spécifiques à l’architecture.
Découverte des fonctionnalités et des interfaces (x64)
Le logiciel invité interagit avec l’hyperviseur par le biais de divers mécanismes. La plupart de ces mécanismes reflètent les mécanismes traditionnels utilisés par les logiciels pour interagir avec le processeur sous-jacent. Par conséquent, ces mécanismes sont spécifiques à l’architecture. Sur l’architecture x64, les mécanismes suivants sont utilisés :
- Instruction CPUID : utilisée pour les informations de fonctionnalité statique et de version.
- MSR (registres spécifiques au modèle) : utilisé pour les valeurs d’état et de contrôle.
- Registres mappés en mémoire : utilisé pour les valeurs d’état et de contrôle.
- Interruptions du processeur : utilisées pour les événements asynchrones, les notifications et les messages.
En plus de ces interfaces spécifiques à l’architecture, l’hyperviseur fournit une interface procédurale simple implémentée avec des hypercalls.
Découverte d’hyperviseur
Avant d’utiliser des interfaces d’hyperviseur, le logiciel doit d’abord déterminer s’il s’exécute dans un environnement virtualisé. Sur les plateformes x64 conformes à cette spécification, cela est effectué en exécutant l’instruction CPUID avec une valeur d’entrée (EAX) de 1. Lors de l’exécution, le code doit vérifier le bit 31 du registre ECX (le « bit présent de l’hyperviseur »). Si ce bit est défini, un hyperviseur est présent. Dans un environnement non virtualisé, le bit est clair.
CPUID.01h.ECX:31 // if set, virtualization present
Si le « bit présent de l’hyperviseur » est défini, des feuilles CPUID supplémentaires peuvent être interrogées pour plus d’informations sur l’hyperviseur conforme et ses fonctionnalités. Deux feuilles de ce type sont garanties d’être disponibles : 0x40000000 et 0x40000001. Par la suite, les feuilles numérotées peuvent également être disponibles.
Feuilles UCID d’hyperviseur standard
Lorsque la feuille à l’adresse 0x40000000 est interrogée, l’hyperviseur retourne des informations qui fournissent le numéro feuille UCID maximal de l’hyperviseur et une signature d’ID de fournisseur.
| Register | Informations fournies |
|---|---|
| EAX | Valeur d’entrée maximale pour les informations CPUID de l’hyperviseur |
| EBX | Signature de l’ID du fournisseur d’hyperviseur |
| ECX | Signature de l’ID du fournisseur d’hyperviseur |
| EDX | Signature de l’ID du fournisseur d’hyperviseur |
Si la feuille est 0x40000001 interrogée, elle retourne une valeur représentant une identification d’interface hyperviseur neutre par le fournisseur. Cela détermine la sémantique des feuilles à partir de 0x40000020x400000FF.
| Register | Informations fournies |
|---|---|
| EAX | Signature de l’interface hyperviseur. |
| EBX | Réservé |
| ECX | Réservé |
| EDX | Réservé |
Ces deux feuilles permettent à l’invité d’interroger l’ID du fournisseur d’hyperviseur et l’interface indépendamment. L’ID du fournisseur est fourni uniquement à des fins d’information et de diagnostic. Il est recommandé que les décisions de compatibilité de base des logiciels uniquement sur la signature d’interface signalée par le biais de feuille 0x40000001.
Feuilles UCID De Microsoft Hypervisor
Sur les hyperviseurs conformes à l’interface UCID de l’hyperviseur Microsoft, les 0x40000000 registres feuille et 0x40000001 les registres ont les valeurs suivantes.
Plage feuille d’hyperviseur CPUID - 0x40000000
EAX détermine la feuille CPUID maximale de l’hyperviseur. EBX-EDX contiennent la signature d’ID du fournisseur d’hyperviseur. La signature de l’ID du fournisseur doit être utilisée uniquement à des fins de création de rapports et de diagnostic.
| Register | Informations fournies |
|---|---|
| EAX | Valeur d’entrée maximale pour les informations CPUID de l’hyperviseur. Sur les hyperviseurs Microsoft, cela sera au moins 0x40000005. |
| EBX | 0x7263694D — « Micr » |
| ECX | 0x666F736F — « osof » |
| EDX | 0x76482074— « t Hv » |
Identification de l’interface neutre du fournisseur d’hyperviseur - 0x40000001
EAX contient la signature d’identification de l’interface d’hyperviseur. Cela détermine la sémantique des feuilles à partir de 0x400000020x400000FF.
| Register | Informations fournies |
|---|---|
| EAX | 0x31237648 — « Hv#1 » |
| EBX | Réservé |
| ECX | Réservé |
| EDX | Réservé |
Les hyperviseurs conformes à l’interface « Hv#1 » fournissent également au moins les feuilles suivantes.
Identité système d’hyperviseur - 0x40000002
| Register | Bits | Informations fournies |
|---|---|---|
| EAX | Numéro de build | |
| EBX | 31-16 | Version majeure |
| 15-0 | Version mineure |
Identification des fonctionnalités d’hyperviseur - 0x40000003
EAX et EBX indiquent quelles fonctionnalités sont disponibles pour la partition en fonction des privilèges de partition actuels.
| Register | Bits | Informations fournies |
|---|---|---|
| EAX | Correspond aux bits 31-0 de HV_PARTITION_PRIVILEGE_MASK | |
| EBX | Correspond aux bits 63-32 de HV_PARTITION_PRIVILEGE_MASK | |
| ECX | 4-0 | Réservé |
| 5 | Mperf invariant est disponible | |
| 6 | La pile d’ombres du superviseur est disponible | |
| 7 | L’UPM architectural est disponible | |
| 8 | L’interception d’interruption d’exception est disponible | |
| 31-9 | Réservé | |
| EDX | 0 | Déconseillé (précédemment indiqué la disponibilité de l’instruction MWAIT) |
| 1 | La prise en charge du débogage invité est disponible | |
| 2 | La prise en charge de l’Analyseur de performances est disponible | |
| 3 | La prise en charge des événements de partitionnement dynamique du processeur physique est disponible | |
| 4 | La prise en charge de la transmission d’un bloc de paramètres d’entrée hypercall via des registres XMM est disponible | |
| 5 | La prise en charge d’un état d’inactivité d’invité virtuel est disponible | |
| 6 | La prise en charge de l’état de veille de l’hyperviseur est disponible | |
| 7 | La prise en charge de l’interrogation des distances NUMA est disponible | |
| 8 | La prise en charge de la détermination des fréquences du minuteur est disponible | |
| 9 | La prise en charge de l’injection de vérifications de machines synthétiques est disponible | |
| 10 | La prise en charge des MSR d’incident invité est disponible | |
| 11 | La prise en charge des MSR de débogage est disponible | |
| 12 | La prise en charge de NPIEP est disponible | |
| 13 | DisableHypervisorAvailable | |
| 14 | ExtendedGvaRangesForFlushVirtualAddressListAvailable | |
| 15 | La prise en charge du retour de la sortie hypercall via des registres XMM est disponible | |
| 16 | Réservé | |
| 17 | SintPollingModeAvailable | |
| 18 | HypercallMsrLockAvailable | |
| 19 | Utiliser des minuteurs synthétiques directs | |
| 20 | Prise en charge de l’inscription PAT disponible pour VSM | |
| Vingt-et-un | Prise en charge de l’inscription bndcfgs disponible pour VSM | |
| 22 | Réservé | |
| 23 | Prise en charge du minuteur non expiré synthétique disponible | |
| 25-24 | Réservé | |
| 26 | Fonctionnalité LBR (Last Branch Record) d’Intel prise en charge | |
| 31-27 | Réservé |
Recommandations d’implémentation - 0x40000004
Indique quels comportements l’hyperviseur recommande l’implémentation du système d’exploitation pour des performances optimales.
| Register | Bits | Informations fournies |
|---|---|---|
| EAX | 0 | Recommandez d’utiliser hypercall pour les commutateurs d’espace d’adressage plutôt que mov vers l’instruction CR3. |
| 1 | Recommandez d’utiliser hypercall pour les vidages TLB locaux au lieu d’instructions INVLPG ou MOV vers CR3. | |
| 2 | Recommandez d’utiliser hypercall pour les vidages TLB distants plutôt que les interruptions entre processeurs. | |
| 3 | Recommandez d’utiliser des MSR pour accéder aux registres APIC eOI, ICR et TPR plutôt que leurs équivalents mappés en mémoire. | |
| 4 | Recommandez d’utiliser le MSR fourni par l’hyperviseur pour lancer une réinitialisation du système. | |
| 5 | Recommandez d’utiliser le minutage détendu pour cette partition. Si elle est utilisée, la machine virtuelle doit désactiver les délais d’expiration de surveillance qui reposent sur la livraison en temps voulu d’interruptions externes. | |
| 6 | Recommandez d’utiliser le remapping DMA. | |
| 7 | Recommandez d’utiliser le remapping d’interruption. | |
| 8 | Réservé. | |
| 9 | Recommander la dépréciation de l’OI automatique. | |
| 10 | Recommandez d’utiliser l’hypercall SyntheticClusterIpi. | |
| 11 | Recommandez d’utiliser l’interface ExProcessorMasks plus récente. | |
| 12 | Indique que l’hyperviseur est imbriqué dans une partition Hyper-V. | |
| 13 | Recommandez d’utiliser INT pour les appels système MBEC. | |
| 14 | Recommandez un hyperviseur imbriqué à l’aide de l’interface VMCS compatible. Indique également que d’autres éclairages imbriqués peuvent être disponibles (voir la 0x4000000A feuille). | |
| 15 | UseSyncedTimeline : indique que la partition doit consommer le biais QueryPerformanceCounter fourni par la partition racine. | |
| 16 | Réservé | |
| 17 | UseDirectLocalFlushEntire : indique que l’invité doit basculer CR4. PGE pour vider l’intégralité du TLB, car cela est plus performant que de créer un hypercall. | |
| 18 | NoNonArchitecturalCoreSharing : indique que le partage de base n’est pas possible. Cela peut être utilisé comme optimisation pour éviter la surcharge de performances de STIBP. | |
| 31-19 | Réservé | |
| EBX | Nombre recommandé de tentatives de nouvelle tentative d’échec de verrouillage avant d’avertir l’hyperviseur des défaillances. 0xFFFFFFFF indique ne jamais notifier. | |
| ECX | 6-0 | ImplementedPhysicalAddressBits : signale la largeur d’adresse physique (MAXPHYADDR) signalée par les processeurs physiques du système. Si tous les bits contiennent 0, la fonctionnalité n’est pas prise en charge. Notez que la valeur signalée est le nombre réel de bits d’adresse physique, et non la position du bit utilisée pour représenter ce nombre. |
| 31-7 | Réservé | |
| EDX | Réservé |
Limites d’implémentation d’hyperviseur - 0x40000005
Décrit les limites d’échelle prises en charge dans l’implémentation actuelle de l’hyperviseur. Si une valeur est égale à zéro, l’hyperviseur n’expose pas les informations correspondantes ; sinon, ils ont ces significations.
| Register | Informations fournies |
|---|---|
| EAX | Nombre maximal de processeurs virtuels pris en charge |
| EBX | Nombre maximal de processeurs logiques pris en charge |
| ECX | Nombre maximal de vecteurs d’interruption physique disponibles pour le remapping d’interruption. |
| EDX | Réservé |
Fonctionnalités matérielles d’implémentation - 0x40000006
Indique quelles fonctionnalités spécifiques au matériel ont été détectées et sont actuellement utilisées par l’hyperviseur.
| Register | Bits | Informations fournies |
|---|---|---|
| EAX | 0 | La prise en charge de l’assistance de superposition APIC est détectée et utilisée. |
| 1 | La prise en charge des bitmaps MSR est détectée et utilisée. | |
| 2 | La prise en charge des compteurs de performances architecturaux est détectée et utilisée. | |
| 3 | La prise en charge de la traduction d’adresses de deuxième niveau est détectée et utilisée. | |
| 4 | La prise en charge du remapping DMA est détectée et utilisée. | |
| 5 | La prise en charge du remapping d’interruption est détectée et utilisée. | |
| 6 | Indique qu’un nettoyage de patrouille de mémoire est présent dans le matériel. | |
| 7 | La protection DMA est en cours d’utilisation. | |
| 8 | HPET est demandé. | |
| 9 | Les minuteurs synthétiques sont volatiles. | |
| 13-10 | Niveau d’hyperviseur de l’invité actuel : « 0 » s’il n’est pas imbriqué. | |
| 14 | Mode de destination physique requis. | |
| 15 | Utilisez VMFUNC pour le commutateur de mappage d’alias. | |
| 16 | La prise en charge de la mise à zéro de la mémoire matérielle est présente. | |
| 17 | La prise en charge de l’invité illimité est présente. | |
| 18 | La prise en charge de l’allocation de ressources (RDT-A, PQOS-A) est présente. | |
| 19 | La prise en charge de la surveillance des ressources (RDT-M, PQOS-M) est présente. | |
| 20 | La prise en charge du PMU virtuel invité est présente. | |
| Vingt-et-un | La prise en charge du LBR virtuel invité est présente. | |
| 22 | La prise en charge de l’IPT virtuelle invité est présente. | |
| 23 | La prise en charge de l’émulation APIC est présente. | |
| Vingt-quatre | La table WDAT ACPI est détectée et utilisée par l’hyperviseur. | |
| 31-25 | Réservé | |
| EBX | Réservé | |
| ECX | Réservé | |
| EDX | Réservé |
Identification des fonctionnalités d’hyperviseur imbriquée - 0x40000009
Décrit les fonctionnalités exposées à la partition par l’hyperviseur lors de l’exécution imbriquée. EAX décrit l’accès aux MSR virtuels. EDX décrit l’accès aux hypercalls.
| Register | Bits | Informations fournies |
|---|---|---|
| EAX | 1-0 | Réservé |
| 2 | AccessSynicRegs | |
| 3 | Réservé | |
| 4 | AccessIntrCtrlRegs | |
| 5 | AccessHypercallMsrs | |
| 6 | AccessVpIndex | |
| 11-7 | Réservé | |
| 12 | AccessReenlightenmentControls | |
| 31-13 | Réservé | |
| EBX | Réservé | |
| ECX | Réservé | |
| EDX | 3-0 | Réservé |
| 4 | XmmRegistersForFastHypercallAvailable | |
| 14-5 | Réservé | |
| 15 | FastHypercallOutputAvailable | |
| 16 | Réservé | |
| 17 | SintPollingModeAvailable | |
| 31-18 | Réservé |
Fonctionnalités de virtualisation imbriquée d’hyperviseur - 0x4000000A
Indique les optimisations de virtualisation imbriquées disponibles pour un hyperviseur imbriqué.
| Register | Bits | Informations fournies |
|---|---|---|
| EAX | 7-0 | Version de VMCS compatible (faible) |
| 15-8 | Version de VMCS compatible (haute) | |
| 16 | Réservé | |
| 17 | Indique la prise en charge des hypercalls de vidage virtuel direct. | |
| 18 | Indique la prise en charge des hypercalls HvCallFlushGuestPhysicalAddressSpace et HvCallFlushGuestPhysicalAddressList (sur les plateformes x64). | |
| 19 | Indique la prise en charge de l’utilisation d’une bitmap MSR compatible. | |
| 20 | Indique la prise en charge de la combinaison d’exceptions de virtualisation dans la classe d’exception d’erreur de page. | |
| Vingt-et-un | Indique la prise en charge de la valeur non nulle du champ 0x00002802 (GuestIa32DebugCtl) dans vmCS. | |
| 22 | Indique la prise en charge du TLB éclairé sur les plateformes AMD. Les vidages ASID n’affectent pas les entrées de LLB dérivées du TRAITÉ. Les hypercalls doivent être utilisés pour invalider les entrées DE L’équilibrage de charge TLB DUTP DU TRAITÉ. Indique également la prise en charge des hypercalls HvCallFlushGuestPhysicalAddressSpace et HvCallFlushGuestPhysicalAddressList. | |
| 31-21 | Réservé | |
| EBX | 0 | Indique la prise en charge des champs GuestPerfGlobalCtrl et HostPerfGlobalCtrl dans vmCS éclairé. |
| 31-1 | Réservé | |
| ECX | Réservé | |
| EDX | Réservé |
Gestion des versions
Les informations de version de l’hyperviseur sont encodées en feuille 0x40000002. Deux numéros de version sont fournis : la version principale et la version du service.
La version principale comprend un numéro de version principal et secondaire et un numéro de build. Celles-ci correspondent aux numéros de publication de Microsoft Windows. La version du service décrit les modifications apportées à la version principale.
Les clients sont fortement encouragés à vérifier les fonctionnalités d’hyperviseur à l’aide de l’UCID quitte 0x400000030x40000005 plutôt qu’en comparant les plages de versions.
Découverte des fonctionnalités et des interfaces (ARM64)
Sur l’architecture ARM64, les mécanismes suivants sont utilisés pour la découverte des fonctionnalités et des interfaces :
- Requêtes HvRegister via HvCallGetVpRegisters : utilisées pour les informations de fonctionnalité statique et de version.
- Registres mappés en mémoire : utilisé pour les valeurs d’état et de contrôle.
En plus de ces interfaces spécifiques à l’architecture, l’hyperviseur fournit une interface procédurale simple implémentée avec des hypercalls.
Découverte d’hyperviseur
Avant d’utiliser la plupart des interfaces d’hyperviseur, le logiciel doit d’abord déterminer s’il s’exécute dans un environnement virtualisé.
Sur ARM64, les logiciels invités peuvent découvrir l’hyperviseur à l’aide de l’interface standard SMCCC (SMC Calling Convention). La découverte est effectuée à l’aide de l’instruction HVC ou SMC avec l’ID 0xC600FF0 de fonction dans X0 (cela correspond à un appel d’hyperviseur spécifique au fournisseur 64 bits, VENDOR_HYP_FUNCTION_CODE_UID). L’appel suit les conventions SMCCC, y compris un imm16 de 0. L’hyperviseur Microsoft retourne les valeurs suivantes représentant le GUID 4d32ba58-cd24-4764-8eef-6c7516597024:
| Register | Valeur |
|---|---|
| X0 | 0x4d32ba58 |
| X1 | 0xcd244764 |
| X2 | 0x8eef6c75 |
| X3 | 0x16597024 |
Une fois qu’un hyperviseur est détecté, le logiciel invité peut interroger des fonctionnalités d’hyperviseur via des registres synthétiques à l’aide de l’hypercall HvCallGetVpRegisters . Plusieurs registres de clés peuvent être interrogés avant que le registre de l’ID du système d’exploitation invité soit défini, ce qui permet la découverte anticipée des fonctionnalités d’hyperviseur pendant le démarrage.
Registres de fonctionnalités d’hyperviseur
Les plateformes ARM64 interrogent des informations d’hyperviseur via des registres synthétiques plutôt que des instructions CPUID. Ces registres fournissent des informations équivalentes à leurs équivalents UCID x64 et sont accessibles via HvCallGetVpRegisters. Tous les registres de fonctionnalités retournent des valeurs 128 bits.
Identité système Hypervisor - HvRegisterHypervisorVersion
Retourne les informations de version encodées dans une valeur 128 bits. La disposition est identique à la feuille ucID x64 0x40000002, avec des valeurs d’inscription x64 packées dans le résultat 128 bits (EAX en bits 31-0, EBX en bits 63-32, ECX en bits 95-64, EDX en bits 127-96).
Identification des fonctionnalités Hypervisor - HvRegisterPrivilegesAndFeaturesInfo
Équivalent à la feuille ucID x64 0x40000003. Indique les fonctionnalités disponibles pour la partition en fonction des privilèges de partition actuels. Retourne une valeur 128 bits avec les champs suivants :
| Bits | Informations fournies |
|---|---|
| 31-0 | Correspond aux bits 31-0 de HV_PARTITION_PRIVILEGE_MASK |
| 63-32 | Correspond aux bits 63-32 de HV_PARTITION_PRIVILEGE_MASK |
| 64 | La prise en charge du débogage invité est disponible. |
| 65 | La prise en charge de l’Analyseur de performances est disponible. |
| 66 | La prise en charge des événements de partitionnement dynamique du processeur physique est disponible. |
| 67 | La prise en charge d’un état d’inactivité d’invité virtuel est disponible. |
| 68 | La prise en charge de l’état de veille de l’hyperviseur est disponible. |
| 69 | La prise en charge de l’interrogation des distances NUMA est disponible. |
| 70 | La prise en charge de la détermination des fréquences du minuteur est disponible. |
| 71 | La prise en charge de l’injection de vérifications de machines synthétiques est disponible. |
| 72 | La prise en charge des registres d’incidents invités est disponible. |
| 73 | Réservé. |
| 74 | DisableHypervisorAvailable. |
| 75 | Réservé. |
| 76 | SintPollingModeAvailable. |
| 77 | Utilisez des minuteurs synthétiques directs. |
| 127-78 | Réservé. |
Recommandations d’implémentation - HvRegisterFeaturesInfo
Équivalent à la feuille UCID x64 0x40000004. Indique quels comportements l’hyperviseur recommande l’implémentation du système d’exploitation pour des performances optimales. Retourne une valeur 128 bits.
| Bits | Informations fournies |
|---|---|
| 0 | UseHvRegisterForReset - Sur ARM64, il s’agit toujours de false (les partitions doivent utiliser psCI SYSTEM_RESET à la place). |
| 1 | Recommandez d’utiliser le minutage détendu pour cette partition. Si elle est utilisée, la machine virtuelle doit désactiver les délais d’expiration de surveillance qui reposent sur la livraison en temps voulu d’interruptions externes. |
| 2 | Recommandez d’utiliser l’hypercall SyntheticClusterIpi. Sur ARM64, il s’agit de false pour la partition racine (qui doit utiliser ICC_SGI1R_EL1 directement) et true pour les partitions invitées. |
| 3 | Recommandez d’utiliser l’interface ExProcessorMasks plus récente. |
| 4 | Indique que l’hyperviseur est imbriqué dans une partition Hyper-V. |
| 5 | Indique que la partition doit consommer le biais QueryPerformanceCounter fourni par la partition racine. |
| 20-6 | Réservé |
| Vingt-et-un | UseHypercallForMmioAccess |
| 22 | UseGpaPinningHypercall |
| 23 | WakeVps |
| 25-24 | Réservé |
| 26 | MapPartitionEventLogBuffer |
| 31-27 | Réservé |
| 63-32 | Nombre recommandé de tentatives de nouvelle tentative d’échec de verrouillage avant d’avertir l’hyperviseur des défaillances. 0xFFFFFFFF indique ne jamais notifier. |
| 127-64 | Réservé |
Limites d’implémentation d’hyperviseur - HvRegisterImplementationLimitsInfo
Décrit les limites d’échelle prises en charge dans l’implémentation actuelle de l’hyperviseur. Si une valeur est égale à zéro, l’hyperviseur n’expose pas les informations correspondantes. Retourne une valeur 128 bits avec une disposition identique à la feuille UCID x64 0x40000005, avec des valeurs d’inscription x64 empaquetées dans le résultat 128 bits (EAX en bits 31-0, EBX en bits 63-32, ECX en bits 95-64, EDX en bits 127-96).
Fonctionnalités matérielles d’implémentation - HvRegisterHardwareFeaturesInfo
Équivalent à la feuille UCID x64 0x40000006. Indique quelles fonctionnalités spécifiques au matériel ont été détectées et sont actuellement utilisées par l’hyperviseur. Retourne une valeur 128 bits.
| Bits | Informations fournies |
|---|---|
| 0 | La prise en charge des compteurs de performances architecturaux est détectée et utilisée. |
| 1 | La prise en charge de la traduction d’adresses de deuxième niveau est détectée et utilisée. |
| 2 | La prise en charge du remapping DMA est détectée et utilisée. |
| 3 | La prise en charge du remapping d’interruption est détectée et utilisée. |
| 4 | Indique qu’un nettoyage de patrouille de mémoire est présent dans le matériel. |
| 5 | La protection DMA est en cours d’utilisation. |
| 6 | Les minuteurs synthétiques sont volatiles. |
| 127-7 | Réservé |
Gestion des versions
Les informations de version d’hyperviseur sont encodées dans HvRegisterHypervisorVersion. Le format correspond à l’équivalent x64.