Delen via


Functie- en interfacedetectie

In deze sectie wordt beschreven hoe gastsoftware de aanwezigheid van een hypervisor detecteert en query's uitvoert op de mogelijkheden, functies en versie-informatie met behulp van architectuurspecifieke detectiemechanismen.

Functie- en interfacedetectie (x64)

Gastsoftware communiceert met de hypervisor via verschillende mechanismen. Veel van deze spiegelen de traditionele mechanismen die door software worden gebruikt om te communiceren met de onderliggende processor. Daarom zijn deze mechanismen architectuurspecifiek. In de x64-architectuur worden de volgende mechanismen gebruikt:

  • CPUID-instructie: wordt gebruikt voor statische functie- en versiegegevens.
  • MSR's (modelspecifieke registers): wordt gebruikt voor status- en controlewaarden.
  • Geheugen-toegewezen registers: wordt gebruikt voor status- en controlewaarden.
  • Processoronderbreken: wordt gebruikt voor asynchrone gebeurtenissen, meldingen en berichten.

Naast deze architectuurspecifieke interfaces biedt de hypervisor een eenvoudige procedurele interface die is geïmplementeerd met hypercalls.

Detectie van hypervisor

Voordat u hypervisorinterfaces gebruikt, moet de software eerst bepalen of deze wordt uitgevoerd in een gevirtualiseerde omgeving. Op x64-platforms die aan deze specificatie voldoen, wordt dit gedaan door de CPUID-instructie uit te voeren met een invoerwaarde (EAX) van 1. Bij de uitvoering moet code bit 31 van het register ECX controleren (de 'hypervisor present bit'). Als deze bit is ingesteld, is er een hypervisor aanwezig. In een niet-gevirtualiseerde omgeving is de bit duidelijk.

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

Als de 'hypervisor present bit' is ingesteld, kunnen extra CPUID-bladbladen worden opgevraagd voor meer informatie over de conforme hypervisor en de bijbehorende mogelijkheden. Twee dergelijke bladeren zijn gegarandeerd beschikbaar: 0x40000000 en 0x40000001. Vervolgens kunnen genummerde bladeren ook beschikbaar zijn.

Standaard bladeren hypervisor CPUID

Wanneer het blad op 0x40000000 een query wordt uitgevoerd, retourneert de hypervisor informatie die het maximale CPUID-bladnummer van de hypervisor en een leverancier-id-handtekening levert.

Register Verstrekte informatie
EAX De maximale invoerwaarde voor informatie over de CPUID van de hypervisor
EBX Handtekening voor leverancier-id van hypervisor
ECX Handtekening voor leverancier-id van hypervisor
EDX Handtekening voor leverancier-id van hypervisor

Als er query's worden uitgevoerd op 0x40000001 het blad, retourneert deze een waarde die een leverancierneutrale hypervisor-interfaceidentificatie vertegenwoordigt. Dit bepaalt de semantiek van de bladeren van 0x4000002 door 0x400000FF.

Register Verstrekte informatie
EAX Handtekening van hypervisorinterface.
EBX Gereserveerd
ECX Gereserveerd
EDX Gereserveerd

Met deze twee bladeren kan de gast de leverancier-id en interface van de hypervisor onafhankelijk opvragen. De leverancier-id wordt alleen verstrekt voor informatieve en diagnostische doeleinden. Het wordt aanbevolen dat software alleen basiscompatibiliteitsbeslissingen op de interfacehandtekening gerapporteerd via leaf 0x40000001.

Microsoft Hypervisor CPUID bladeren

Bij hypervisors die voldoen aan de CPUID-interface van microsoft hypervisor, hebben de 0x40000000 en 0x40000001 leaf-registers de volgende waarden.

Hypervisor CPUID Leaf Range - 0x40000000

EAX bepaalt het maximale CPUID-blad van de hypervisor. EBX-EDX de handtekening van de leverancier-id van de hypervisor bevatten. De handtekening van de leverancier-id mag alleen worden gebruikt voor rapportage- en diagnostische doeleinden.

Register Verstrekte informatie
EAX De maximale invoerwaarde voor informatie over de CPUID van de hypervisor. Op Microsoft-hypervisors is dit ten minste 0x40000005.
EBX 0x7263694D— "Micr"
ECX 0x666F736F— "osof"
EDX 0x76482074— "t Hv"

Identificatie van hypervisor vendor-neutral interface - 0x40000001

EAX bevat de handtekening voor identificatie van de hypervisorinterface. Dit bepaalt de semantiek van de bladeren van 0x40000002 door 0x400000FF.

Register Verstrekte informatie
EAX 0x31237648— "Hv#1"
EBX Gereserveerd
ECX Gereserveerd
EDX Gereserveerd

Hypervisors die voldoen aan de interface 'Hv#1', bieden ten minste de volgende bladeren.

Hypervisor-systeemidentiteit - 0x40000002

Register Bits Verstrekte informatie
EAX Buildnummer
EBX 31-16 Hoofdversie
15-0 Kleine versie

Identificatie van hypervisorfuncties - 0x40000003

EAX en EBX geven aan welke functies beschikbaar zijn voor de partitie op basis van de huidige partitiebevoegdheden.

Register Bits Verstrekte informatie
EAX Komt overeen met bits 31-0 van HV_PARTITION_PRIVILEGE_MASK
EBX Komt overeen met bits 63-32 van HV_PARTITION_PRIVILEGE_MASK
ECX 4-0 Gereserveerd
5 Invariant Mperf is beschikbaar
6 Supervisor-schaduwstack is beschikbaar
7 Architectural PMU is beschikbaar
8 Het onderscheppen van uitzonderingen is beschikbaar
31-9 Gereserveerd
EDX 0 Afgeschaft (eerder aangegeven beschikbaarheid van de MWAIT-instructie)
1 Ondersteuning voor gastopsporing is beschikbaar
2 Ondersteuning voor prestatiemeter is beschikbaar
3 Ondersteuning voor dynamische partitioneringsevenementen van fysieke CPU is beschikbaar
4 Ondersteuning voor het doorgeven van hypercall-invoerparameterblok via XMM-registers is beschikbaar
5 Er is ondersteuning beschikbaar voor een status van een virtuele gast die niet actief is
6 Ondersteuning voor de slaapstand van de hypervisor is beschikbaar
7 Ondersteuning voor het uitvoeren van query's op NUMA-afstanden is beschikbaar
8 Ondersteuning voor het bepalen van timerfrequenties is beschikbaar
9 Ondersteuning voor het injecteren van synthetische machinecontroles is beschikbaar
10 Ondersteuning voor gastcrash-MSR's is beschikbaar
11 Ondersteuning voor foutopsporings-MSR's is beschikbaar
12 Ondersteuning voor NPIEP is beschikbaar
13 DisableHypervisorAvailable
14 ExtendedGvaRangesForFlushVirtualAddressListAvailable
15 Ondersteuning voor het retourneren van hypercall-uitvoer via XMM-registers is beschikbaar
16 Gereserveerd
17 SintPollingModeAvailable
18 HypercallMsrLockAvailable
19 Directe synthetische timers gebruiken
20 Ondersteuning voor PAT-register beschikbaar voor VSM
21 Ondersteuning voor bndcfgs-register beschikbaar voor VSM
22 Gereserveerd
23 Ondersteuning voor synthetische tijdonthalingstimer beschikbaar
25-24 Gereserveerd
26 De LBR-functie (Last Branch Record) van Intel wordt ondersteund
31-27 Gereserveerd

Implementatieaanbeveling - 0x40000004

Geeft aan welk gedrag de hypervisor het besturingssysteem aanbeveelt voor optimale prestaties.

Register Bits Verstrekte informatie
EAX 0 Het is raadzaam hypercall te gebruiken voor adresruimteswitches in plaats van MOV naar CR3-instructie.
1 U kunt het beste hypercall gebruiken voor lokale TLB-flushes in plaats van INVLPG of MOV naar CR3-instructies.
2 U kunt het beste hypercall gebruiken voor externe TLB-flushes in plaats van interprocessoronderbreken.
3 U wordt aangeraden MSR's te gebruiken voor toegang tot APIC-registers EOI, ICR en TPR in plaats van hun geheugen-toegewezen tegenhangers.
4 U kunt het beste de door de hypervisor geleverde MSR gebruiken om een systeemRESET te starten.
5 U kunt het beste ontspannen timing gebruiken voor deze partitie. Als deze wordt gebruikt, moet de VM time-outs voor watchdogs uitschakelen die afhankelijk zijn van de tijdige levering van externe interrupts.
6 U kunt het beste opnieuw toewijzen met DMA.
7 U kunt het beste onderbreken opnieuw toewijzen.
8 Gereserveerd.
9 U wordt aangeraden AutoEOI af te schalen.
10 Het gebruik van SyntheticClusterIpi hypercall aanbevelen.
11 U kunt het beste de nieuwere ExProcessorMasks-interface gebruiken.
12 Geeft aan dat de hypervisor is genest binnen een Hyper-V partitie.
13 U kunt het beste INT gebruiken voor MBEC-systeemoproepen.
14 Raad een geneste hypervisor aan met behulp van de verlichte VMCS-interface. Geeft ook aan dat er mogelijk extra geneste verlichting beschikbaar is (zie leaf 0x4000000A).
15 UseSyncedTimeline: geeft aan dat de partitie de bias QueryPerformanceCounter moet gebruiken die wordt geleverd door de hoofdpartitie.
16 Gereserveerd
17 UseDirectLocalFlushEntire : geeft aan dat de gast CR4 moet in-/uitschakelen. PGE om de hele TLB leeg te maken, omdat dit beter presteert dan het maken van een hypercall.
18 NoNonArchitecturalCoreSharing - geeft aan dat kerndeling niet mogelijk is. Dit kan worden gebruikt als optimalisatie om de prestatieoverhead van STIBP te voorkomen.
31-19 Gereserveerd
EBX Aanbevolen aantal pogingen om een spinlockfout opnieuw uit te voeren voordat de hypervisor op de hoogte wordt gebracht van de fouten. 0xFFFFFFFF geeft aan dat ze nooit op de hoogte zijn.
ECX 6-0 ImplementedPhysicalAddressBits : rapporteert de fysieke adresbreedte (MAXPHYADDR) die door de fysieke processors van het systeem is gerapporteerd. Als alle bits 0 bevatten, wordt de functie niet ondersteund. Houd er rekening mee dat de gerapporteerde waarde het werkelijke aantal fysieke adres-bits is en niet de bitpositie die wordt gebruikt om dat getal weer te geven.
31-7 Gereserveerd
EDX Gereserveerd

Implementatielimieten voor hypervisor - 0x40000005

Beschrijft de schaallimieten die worden ondersteund in de huidige hypervisor-implementatie. Als een waarde nul is, geeft de hypervisor de bijbehorende informatie niet weer; anders hebben ze deze betekenissen.

Register Verstrekte informatie
EAX Het maximum aantal ondersteunde virtuele processors
EBX Het maximum aantal ondersteunde logische processors
ECX Het maximum aantal fysieke interruptvectoren dat beschikbaar is voor het opnieuw toewijzen van interrupts.
EDX Gereserveerd

Hardwarefuncties voor implementatie - 0x40000006

Geeft aan welke hardwarespecifieke functies zijn gedetecteerd en momenteel worden gebruikt door de hypervisor.

Register Bits Verstrekte informatie
EAX 0 Ondersteuning voor APIC-overlayhulp wordt gedetecteerd en in gebruik.
1 Ondersteuning voor MSR-bitmaps wordt gedetecteerd en in gebruik.
2 Ondersteuning voor prestatiemeteritems voor architectuur wordt gedetecteerd en in gebruik.
3 Ondersteuning voor adresomzetting op het tweede niveau wordt gedetecteerd en in gebruik.
4 Ondersteuning voor opnieuw toewijzen van DMA's wordt gedetecteerd en in gebruik.
5 Ondersteuning voor het opnieuw toewijzen van interrupts wordt gedetecteerd en in gebruik.
6 Geeft aan dat er een geheugenpatrouillescrubber aanwezig is in de hardware.
7 DMA-beveiliging wordt gebruikt.
8 HPET wordt aangevraagd.
9 Synthetische timers zijn vluchtig.
13-10 Het hypervisorniveau van de huidige gast - '0' als deze niet is genest.
14 Fysieke doelmodus vereist.
15 GEBRUIK VMFUNC voor aliastoewijzingsswitch.
16 Ondersteuning voor hardwaregeheugennulering is aanwezig.
17 Ondersteuning voor Onbeperkte gast is aanwezig.
18 Ondersteuning voor resourcetoewijzing (RDT-A, PQOS-A) is aanwezig.
19 Ondersteuning voor resourcebewaking (RDT-M, PQOS-M) is aanwezig.
20 Ondersteuning voor gast virtuele PMU is aanwezig.
21 Ondersteuning voor virtuele gast-LBR is aanwezig.
22 Ondersteuning voor virtuele IPT van gasten is aanwezig.
23 Ondersteuning voor APIC-emulatie is aanwezig.
24 De ACPI WDAT-tabel wordt gedetecteerd en wordt gebruikt door de hypervisor.
31-25 Gereserveerd
EBX Gereserveerd
ECX Gereserveerd
EDX Gereserveerd

Identificatie van geneste hypervisorfuncties - 0x40000009

Beschrijft de functies die beschikbaar zijn voor de partitie door de hypervisor bij het uitvoeren van geneste items. EAX beschrijft de toegang tot virtuele MSR's. EDX beschrijft de toegang tot hypercalls.

Register Bits Verstrekte informatie
EAX 1-0 Gereserveerd
2 AccessSynicRegs
3 Gereserveerd
4 AccessIntrCtrlRegs
5 AccessHypercallMsrs
6 AccessVpIndex
11-7 Gereserveerd
12 AccessReenlightenmentControls
31-13 Gereserveerd
EBX Gereserveerd
ECX Gereserveerd
EDX 3-0 Gereserveerd
4 XmmRegistersForFastHypercallAvailable
14-5 Gereserveerd
15 FastHypercallOutputAvailable
16 Gereserveerd
17 SintPollingModeAvailable
31-18 Gereserveerd

Functies voor geneste virtualisatie van hypervisor - 0x4000000A

Geeft aan welke geneste virtualisatieoptimalisaties beschikbaar zijn voor een geneste hypervisor.

Register Bits Verstrekte informatie
EAX 7-0 Verlichte VMCS-versie (laag)
15-8 Verlichte VMCS-versie (hoog)
16 Gereserveerd
17 Geeft ondersteuning aan voor directe virtuele flush hypercalls.
18 Geeft ondersteuning aan voor de HvCallFlushGuestPhysicalAddressSpace en HvCallFlushGuestPhysicalAddressList hypercalls (op x64-platforms).
19 Geeft ondersteuning aan voor het gebruik van een verlichte MSR-bitmap.
20 Geeft ondersteuning aan voor het combineren van virtualisatie-uitzonderingen in de foutklasse van de pagina.
21 Geeft ondersteuning aan voor niet-nulwaarde van het veld 0x00002802 (GuestIa32DebugCtl) in de VMCS.
22 Geeft ondersteuning aan voor de verlichte TLB op AMD-platforms. ASID-flushes zijn niet van invloed op TLB-vermeldingen die zijn afgeleid van de NPT. Hypercalls moeten worden gebruikt om NPT TLB-vermeldingen ongeldig te maken. Geeft ook ondersteuning aan voor de HvCallFlushGuestPhysicalAddressSpace en HvCallFlushGuestPhysicalAddressList hypercalls.
31-21 Gereserveerd
EBX 0 Geeft ondersteuning aan voor de velden GuestPerfGlobalCtrl en HostPerfGlobalCtrl in de verlichte VMCS.
31-1 Gereserveerd
ECX Gereserveerd
EDX Gereserveerd

Versioning

De informatie over de hypervisorversie wordt gecodeerd in leaf 0x40000002. Er zijn twee versienummers opgegeven: de hoofdversie en de serviceversie.

De hoofdversie bevat een primaire en secundaire versienummer en een buildnummer. Deze komen overeen met de releasenummers van Microsoft Windows. De serviceversie beschrijft wijzigingen die zijn aangebracht in de hoofdversie.

Clients worden sterk aangeraden om te controleren op hypervisorfuncties door CPUID te 0x400000030x40000005 gebruiken in plaats van te vergelijken met versiebereiken.

Functie- en interfacedetectie (ARM64)

In de ARM64-architectuur worden de volgende mechanismen gebruikt voor functie- en interfacedetectie:

  • HvRegister-query's via HvCallGetVpRegisters – Wordt gebruikt voor statische functie- en versiegegevens.
  • Geheugen-toegewezen registers: wordt gebruikt voor status- en controlewaarden.

Naast deze architectuurspecifieke interfaces biedt de hypervisor een eenvoudige procedurele interface die is geïmplementeerd met hypercalls.

Detectie van hypervisor

Voordat u de meeste hypervisorinterfaces gebruikt, moet de software eerst bepalen of deze wordt uitgevoerd in een gevirtualiseerde omgeving.

In ARM64 kan gastsoftware de hypervisor detecteren met behulp van de standaardinterface van SMCCC (SMC Calling Convention). De detectie wordt uitgevoerd met behulp van de HVC- of SMC-instructie met de functie-id 0xC600FF0 in X0 (dit komt overeen met een 64-bits leverancierspecifieke hypervisoraanroep, VENDOR_HYP_FUNCTION_CODE_UID). De oproep volgt de SMCCC-conventies, waaronder een imm16 van 0. De Microsoft-hypervisor retourneert de volgende waarden die de GUID 4d32ba58-cd24-4764-8eef-6c7516597024vertegenwoordigen:

Register Waarde
X0 0x4d32ba58
X1 0xcd244764
X2 0x8eef6c75
X3 0x16597024

Zodra een hypervisor is gedetecteerd, kan gastsoftware query's uitvoeren op hypervisormogelijkheden via synthetische registers met behulp van de Hypercalls HvCallGetVpRegisters . Er kunnen verschillende sleutelregisters worden opgevraagd voordat het register van het gastbesturingssysteem is ingesteld, waardoor vroege detectie van hypervisorfuncties mogelijk is tijdens het opstarten.

Hypervisor-functieregisters

ARM64-platformen doorzoeken hypervisorgegevens via synthetische registers in plaats van CPUID-instructies. Deze registers bieden equivalente informatie aan hun x64 CPUID-tegenhangers en worden geopend via HvCallGetVpRegisters. Alle functieregisters retourneren 128-bits waarden.

Hypervisor System Identity - HvRegisterHypervisorVersion

Retourneert versiegegevens die zijn gecodeerd in een 128-bits waarde. De indeling is identiek aan x64 CPUID leaf 0x40000002, waarbij x64 registerwaarden zijn verpakt in het 128-bits resultaat (EAX in bits 31-0, EBX in bits 63-32, ECX in bits 95-64, EDX in bits 127-96).

Identificatie van hypervisorfuncties - HvRegisterPrivilegesAndFeaturesInfo

Gelijk aan x64 CPUID leaf 0x40000003. Geeft aan welke functies beschikbaar zijn voor de partitie op basis van de huidige partitiebevoegdheden. Retourneert een 128-bits waarde met deze velden:

Bits Verstrekte informatie
31-0 Komt overeen met bits 31-0 van HV_PARTITION_PRIVILEGE_MASK
63-32 Komt overeen met bits 63-32 van HV_PARTITION_PRIVILEGE_MASK
64 Ondersteuning voor gastopsporing is beschikbaar.
65 Ondersteuning voor Performance Monitor is beschikbaar.
66 Ondersteuning voor dynamische partitioneringsevenementen van fysieke CPU is beschikbaar.
67 Er is ondersteuning beschikbaar voor een niet-actieve status van een virtuele gast.
68 Ondersteuning voor de status van de hypervisor slaapstand is beschikbaar.
69 Ondersteuning voor het uitvoeren van query's op NUMA-afstanden is beschikbaar.
70 Ondersteuning voor het bepalen van timerfrequenties is beschikbaar.
71 Ondersteuning voor het injecteren van synthetische machinecontroles is beschikbaar.
72 Ondersteuning voor gastcrashregisters is beschikbaar.
73 Gereserveerd.
74 DisableHypervisorAvailable.
75 Gereserveerd.
76 SintPollingModeAvailable.
77 Gebruik directe synthetische timers.
127-78 Gereserveerd.

Implementatieaanbevelingen - HvRegisterFeaturesInfo

Gelijk aan x64 CPUID leaf 0x40000004. Geeft aan welk gedrag de hypervisor het besturingssysteem aanbeveelt voor optimale prestaties. Retourneert een 128-bits waarde.

Bits Verstrekte informatie
0 UseHvRegisterForReset - In ARM64 is dit altijd onwaar (partities moeten in plaats daarvan PSCI-SYSTEM_RESET gebruiken).
1 U kunt het beste ontspannen timing gebruiken voor deze partitie. Als deze wordt gebruikt, moet de VM time-outs voor watchdogs uitschakelen die afhankelijk zijn van de tijdige levering van externe interrupts.
2 Het gebruik van SyntheticClusterIpi hypercall aanbevelen. In ARM64 is dit onwaar voor de hoofdpartitie (die rechtstreeks ICC_SGI1R_EL1 moet gebruiken) en waar voor gastpartities.
3 U kunt het beste de nieuwere ExProcessorMasks-interface gebruiken.
4 Geeft aan dat de hypervisor is genest binnen een Hyper-V partitie.
5 Hiermee wordt aangegeven dat de partitie de bias QueryPerformanceCounter moet gebruiken die is opgegeven door de hoofdpartitie.
20-6 Gereserveerd
21 UseHypercallForMmioAccess
22 UseGpaPinningHypercall
23 WakeVps
25-24 Gereserveerd
26 MapPartitionEventLogBuffer
31-27 Gereserveerd
63-32 Aanbevolen aantal pogingen om een spinlockfout opnieuw uit te voeren voordat de hypervisor op de hoogte wordt gebracht van de fouten. 0xFFFFFFFF geeft aan dat ze nooit op de hoogte zijn.
127-64 Gereserveerd

Implementatielimieten voor hypervisor - HvRegisterImplementationLimitsInfo

Beschrijft de schaallimieten die worden ondersteund in de huidige hypervisor-implementatie. Als een waarde nul is, geeft de hypervisor de bijbehorende informatie niet weer. Retourneert een 128-bits waarde met een indeling die identiek is aan x64 CPUID leaf 0x40000005, waarbij x64 registerwaarden zijn verpakt in het 128-bits resultaat (EAX in bits 31-0, EBX in bits 63-32, ECX in bits 95-64, EDX in bits 127-96).

Hardwarefuncties voor implementatie - HvRegisterHardwareFeaturesInfo

Gelijk aan x64 CPUID leaf 0x40000006. Geeft aan welke hardwarespecifieke functies zijn gedetecteerd en momenteel worden gebruikt door de hypervisor. Retourneert een 128-bits waarde.

Bits Verstrekte informatie
0 Ondersteuning voor prestatiemeteritems voor architectuur wordt gedetecteerd en in gebruik.
1 Ondersteuning voor adresomzetting op het tweede niveau wordt gedetecteerd en in gebruik.
2 Ondersteuning voor opnieuw toewijzen van DMA's wordt gedetecteerd en in gebruik.
3 Ondersteuning voor het opnieuw toewijzen van interrupts wordt gedetecteerd en in gebruik.
4 Geeft aan dat er een geheugenpatrouillescrubber aanwezig is in de hardware.
5 DMA-beveiliging wordt gebruikt.
6 Synthetische timers zijn vluchtig.
127-7 Gereserveerd

Versioning

De informatie over de hypervisorversie wordt gecodeerd in HvRegisterHypervisorVersion. De notatie komt overeen met het x64-equivalent.