Udostępnij przez


Odnajdywanie funkcji i interfejsu

W tej sekcji opisano, jak oprogramowanie gościa wykrywa obecność funkcji hypervisor i wykonuje zapytania dotyczące jego możliwości, funkcji i informacji o wersji przy użyciu mechanizmów odnajdywania specyficznych dla architektury.

Odnajdywanie funkcji i interfejsu (x64)

Oprogramowanie gościa współdziała z funkcją hypervisor za pomocą różnych mechanizmów. Wiele z tych dubluje tradycyjne mechanizmy używane przez oprogramowanie do interakcji z procesorem bazowym. W związku z tym te mechanizmy są specyficzne dla architektury. W architekturze x64 są używane następujące mechanizmy:

  • Instrukcja CPUID — służy do obsługi statycznych informacji o funkcji i wersji.
  • MsR (rejestry specyficzne dla modelu) — używane do określania stanu i wartości kontrolek.
  • Rejestry mapowane w pamięci — używane do obsługi wartości stanu i kontroli.
  • Przerwania procesora — używane w przypadku zdarzeń asynchronicznych, powiadomień i komunikatów.

Oprócz tych interfejsów specyficznych dla architektury funkcja hypervisor udostępnia prosty interfejs proceduralny zaimplementowany za pomocą funkcji hypercalls.

Odnajdywanie funkcji Hypervisor

Przed użyciem jakichkolwiek interfejsów funkcji hypervisor oprogramowanie powinno najpierw określić, czy działa w środowisku zwirtualizowanym. Na platformach x64, które są zgodne z tą specyfikacją, odbywa się to przez wykonanie instrukcji CPUID z wartością wejściową (EAX) 1. Podczas wykonywania kod powinien sprawdzić bit 31 rejestru ECX ("hypervisor obecny bit"). Jeśli ten bit jest ustawiony, funkcja hypervisor jest obecna. W środowisku niezwirtualizowanym bit będzie jasny.

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

Jeśli ustawiono parametr "hypervisor present bit", dodatkowe liście CPUID można odpytować, aby uzyskać więcej informacji na temat zgodnej funkcji hypervisor i jej możliwości. Dwa takie liście mają gwarancję dostępności: 0x40000000 i 0x40000001. Później ponumerowane liście mogą być również dostępne.

Standardowe liście identyfikatora CPUID funkcji Hypervisor

Po wysłaniu zapytania do liścia 0x40000000 funkcja hypervisor zwróci informacje, które udostępniają maksymalny numer liścia CPUID funkcji hypervisor i sygnaturę identyfikatora dostawcy.

Register Podane informacje
EAX Maksymalna wartość wejściowa dla informacji o identyfikatorze CPUID funkcji hypervisor
EBX Podpis identyfikatora dostawcy funkcji Hypervisor
ECX Podpis identyfikatora dostawcy funkcji Hypervisor
EDX Podpis identyfikatora dostawcy funkcji Hypervisor

Jeśli zostanie zwrócony kwerenda liścia 0x40000001 , zwróci wartość reprezentującą identyfikację interfejsu funkcji hypervisor neutralnej od dostawcy. Określa semantyka liści z 0x4000002 przez 0x400000FF.

Register Podane informacje
EAX Podpis interfejsu funkcji Hypervisor.
EBX Zarezerwowana
ECX Zarezerwowana
EDX Zarezerwowana

Te dwa liście umożliwiają gościowi wykonywanie zapytań dotyczących identyfikatora dostawcy funkcji hypervisor i interfejsu niezależnie. Identyfikator dostawcy jest udostępniany tylko w celach informacyjnych i diagnostycznych. Zaleca się, aby oprogramowanie było oparte tylko na decyzjach dotyczących zgodności w podpisie interfejsu zgłoszonym za pośrednictwem liścia 0x40000001.

Liście identyfikatora CPUID funkcji Microsoft Hypervisor

W przypadku funkcji hypervisor zgodnych z interfejsem 0x40000000 CPUID funkcji hypervisor firmy Microsoft rejestry i 0x40000001 liści będą miały następujące wartości.

Zakres liści procesora CPUID funkcji Hypervisor — 0x40000000

EAX określa maksymalny liść cpuID funkcji hypervisor. EBX-EDX zawierają sygnaturę identyfikatora dostawcy funkcji hypervisor. Sygnatura identyfikatora dostawcy powinna być używana tylko do celów raportowania i diagnostyki.

Register Podane informacje
EAX Maksymalna wartość wejściowa dla informacji o identyfikatorze CPUID funkcji hypervisor. W przypadku funkcji hypervisor firmy Microsoft będzie to co najmniej 0x40000005.
EBX 0x7263694D — "Micr"
ECX 0x666F736F — "osof"
EDX 0x76482074 — "t Hv"

Identyfikacja interfejsu neutralnego dostawcy funkcji Hypervisor — 0x40000001

EaX zawiera sygnaturę identyfikacji interfejsu funkcji hypervisor. Określa semantyka liści z 0x40000002 przez 0x400000FF.

Register Podane informacje
EAX 0x31237648 — "Hv#1"
EBX Zarezerwowana
ECX Zarezerwowana
EDX Zarezerwowana

Funkcje hypervisor zgodne z interfejsem "Hv#1" zapewniają również co najmniej następujące liście.

Tożsamość systemu funkcji Hypervisor — 0x40000002

Register Bity Podane informacje
EAX Numer kompilacji
EBX 31-16 Wersja główna
15-0 Wersja pomocnicza

Identyfikacja funkcji hypervisor — 0x40000003

EaX i EBX wskazują, które funkcje są dostępne dla partycji na podstawie bieżących uprawnień partycji.

Register Bity Podane informacje
EAX Odpowiada bitom 31-0 HV_PARTITION_PRIVILEGE_MASK
EBX Odpowiada bitom 63–32 HV_PARTITION_PRIVILEGE_MASK
ECX 4-0 Zarezerwowana
5 Niezmienny Mperf jest dostępny
6 Dostępny jest stos nadzorcy w tle
7 Architektura PMU jest dostępna
8 Przechwycenie pułapki wyjątków jest dostępne
31-9 Zarezerwowana
EDX 0 Przestarzałe (wcześniej wskazana dostępność instrukcji MWAIT)
1 Dostępna jest obsługa debugowania gościa
2 Dostępna jest obsługa monitora wydajności
3 Obsługa zdarzeń dynamicznego partycjonowania procesora CPU fizycznego jest dostępna
4 Dostępna jest obsługa przekazywania bloku parametrów wejściowych funkcji hypercall za pośrednictwem rejestrów XMM
5 Dostępna jest obsługa stanu bezczynności wirtualnego gościa
6 Obsługa stanu uśpienia funkcji hypervisor jest dostępna
7 Obsługa wykonywania zapytań o odległości NUMA jest dostępna
8 Obsługa określania częstotliwości czasomierza jest dostępna
9 Dostępna jest obsługa iniekcji testów maszyn syntetycznych
10 Dostępna jest obsługa reguł MSRs awarii gościa
11 Dostępna jest obsługa debugowania msrs
12 Obsługa serwera NPIEP jest dostępna
13 DisableHypervisorAvailable
14 ExtendedGvaRangesForFlushVirtualAddressListAvailable
15 Dostępna jest obsługa zwracania danych wyjściowych funkcji hypercall za pośrednictwem rejestrów XMM
16 Zarezerwowana
17 SintPollingModeAvailable
18 HypercallMsrLockAvailable
19 Używanie bezpośrednich czasomierzy syntetycznych
20 Obsługa rejestrowania pat dostępnego dla programu VSM
dwadzieścia jeden Obsługa rejestrowania bndcfgs dostępnego dla programu VSM
22 Zarezerwowana
23 Obsługa czas syntetycznego niedbalnego dostępnego czasomierza
25-24 Zarezerwowana
26 Obsługiwana funkcja ostatniego rekordu gałęzi (LBR) firmy Intel
31-27 Zarezerwowana

Zalecenia dotyczące implementacji — 0x40000004

Wskazuje, które zachowanie funkcji hypervisor zaleca zaimplementowanie systemu operacyjnego w celu uzyskania optymalnej wydajności.

Register Bity Podane informacje
EAX 0 Zaleca się używanie funkcji hypercall dla przełączników przestrzeni adresowej, a nie MOV do instrukcji CR3.
1 Zalecamy używanie funkcji hypercall dla lokalnych opróżnień TLB, a nie INSTRUKCJE INVLPG lub MOV do CR3.
2 Zaleca się używanie funkcji hypercall dla zdalnych opróżnień TLB, a nie przerwań między procesorami.
3 Zalecamy korzystanie z msR na potrzeby uzyskiwania dostępu do rejestrów APIC EOI, ICR i TPR, a nie ich odpowiedników mapowanych w pamięci.
4 Zalecamy użycie zarządzanego przez funkcję hypervisor do zainicjowania resetowania systemu.
5 Zalecamy użycie złagodzonego chronometrażu dla tej partycji. Jeśli jest używany, maszyna wirtualna powinna wyłączyć wszelkie limity czasu watchdog, które polegają na terminowym dostarczaniu zewnętrznych przerwań.
6 Zaleca się używanie ponownego mapowania dma.
7 Zalecamy ponowne mapowanie przerwań.
8 Zarezerwowane.
9 Zalecamy wycofanie autoEOI.
10 Zaleca się używanie funkcji Hypercall SyntheticClusterIpi.
11 Zalecamy używanie nowszego interfejsu ExProcessorMasks.
12 Wskazuje, że funkcja hypervisor jest zagnieżdżona w ramach partycji Hyper-V.
13 Zaleca się używanie protokołu INT dla wywołań systemowych MBEC.
14 Zalecane zagnieżdżonej funkcji hypervisor przy użyciu interfejsu z obsługą usługi VMCS. Wskazuje również, że mogą być dostępne dodatkowe zagnieżdżone oświecenia (zobacz 0x4000000A liści).
15 UseSyncedTimeline — wskazuje, że partycja powinna używać stronniczość QueryPerformanceCounter dostarczona przez partycję główną.
16 Zarezerwowana
17 UseDirectLocalFlushEntire — wskazuje, że gość powinien przełączać cr4. KG do opróżnienia całego TLB, ponieważ jest to bardziej wydajne niż wykonywanie hipercall.
18 NoNonArchitecturalCoreSharing — wskazuje, że udostępnianie rdzeni nie jest możliwe. Może to służyć jako optymalizacja, aby uniknąć obciążenia związanego z wydajnością STIBP.
31-19 Zarezerwowana
EBX Zalecana liczba prób ponawiania próby ponowienia błędu spinlock przed powiadomieniem funkcji hypervisor o awariach. 0xFFFFFFFF wskazuje, że nigdy nie powiadamiaj.
ECX 6-0 ImplementPhysicalAddressBits — zgłasza szerokość adresu fizycznego (MAXPHYADDR) zgłoszoną przez procesory fizyczne systemu. Jeśli wszystkie bity zawierają wartość 0, funkcja nie jest obsługiwana. Należy pamiętać, że zgłoszona wartość to rzeczywista liczba bitów adresów fizycznych, a nie pozycja bitów używana do reprezentowania tej liczby.
31-7 Zarezerwowana
EDX Zarezerwowana

Limity implementacji funkcji Hypervisor — 0x40000005

Opisuje limity skalowania obsługiwane w bieżącej implementacji funkcji hypervisor. Jeśli jakakolwiek wartość ma wartość zero, funkcja hypervisor nie uwidacznia odpowiednich informacji; w przeciwnym razie mają te znaczenia.

Register Podane informacje
EAX Maksymalna liczba obsługiwanych procesorów wirtualnych
EBX Maksymalna liczba obsługiwanych procesorów logicznych
ECX Maksymalna liczba fizycznych wektorów przerwań dostępnych do ponownego mapowania przerwań.
EDX Zarezerwowana

Funkcje sprzętu implementacji — 0x40000006

Wskazuje, które funkcje specyficzne dla sprzętu zostały wykryte i są obecnie używane przez funkcję hypervisor.

Register Bity Podane informacje
EAX 0 Obsługa asysty nakładki APIC jest wykrywana i używana.
1 Obsługa map bitowych MSR jest wykrywana i używana.
2 Obsługa liczników wydajności architektury jest wykrywana i używana.
3 Obsługa translacji adresów drugiego poziomu jest wykrywana i używana.
4 Obsługa ponownego mapowania DMA jest wykrywana i używana.
5 Obsługa ponownego mapowania przerwań jest wykrywana i używana.
6 Wskazuje, że w sprzęcie znajduje się szorer patrolujący pamięci.
7 Ochrona DMA jest używana.
8 Zażądano zestawu HPET.
9 Czasomierze syntetyczne są niestabilne.
13-10 Poziom funkcji hypervisor bieżącego gościa — "0", jeśli nie jest zagnieżdżony.
14 Wymagany jest tryb docelowy fizyczny.
15 Użyj vmFUNC na potrzeby przełącznika mapy aliasu.
16 Obsługa zera pamięci sprzętowej jest obecna.
17 Obsługa nieograniczonego gościa jest obecna.
18 Obsługa alokacji zasobów (RDT-A, PQOS-A) jest obecna.
19 Obsługa monitorowania zasobów (RDT-M, PQOS-M) jest obecna.
20 Obsługa wirtualnej jednostki PMU gościa jest obecna.
dwadzieścia jeden Obsługa wirtualnego LBR gościa jest obecna.
22 Obsługa wirtualnego IPT gościa jest obecna.
23 Obsługa emulacji APIC jest obecna.
24 Tabela ACPI WDAT jest wykrywana i używana przez funkcję hypervisor.
31-25 Zarezerwowana
EBX Zarezerwowana
ECX Zarezerwowana
EDX Zarezerwowana

Identyfikacja funkcji funkcji hypervisor zagnieżdżonych — 0x40000009

Opisuje funkcje uwidocznione na partycji przez funkcję hypervisor podczas uruchamiania zagnieżdżonego. EaX opisuje dostęp do wirtualnych msRs. EDX opisuje dostęp do hipercalls.

Register Bity Podane informacje
EAX 1-0 Zarezerwowana
2 AccessSynicRegs
3 Zarezerwowana
4 AccessIntrCtrlRegs
5 AccessHypercallMsrs
6 AccessVpIndex
11-7 Zarezerwowana
12 AccessReenlightenmentControls
31-13 Zarezerwowana
EBX Zarezerwowana
ECX Zarezerwowana
EDX 3-0 Zarezerwowana
4 XmmRegistersForFastHypercallAvailable
14-5 Zarezerwowana
15 FastHypercallOutputAvailable
16 Zarezerwowana
17 SintPollingModeAvailable
31-18 Zarezerwowana

Funkcje wirtualizacji zagnieżdżonej funkcji hypervisor — 0x4000000A

Wskazuje, które zagnieżdżone optymalizacje wirtualizacji są dostępne dla zagnieżdżonej funkcji hypervisor.

Register Bity Podane informacje
EAX 7-0 Wersja usługi VMCS z obsługą (niska)
15-8 Wersja usługi VMCS z obsługą (wysoka)
16 Zarezerwowana
17 Wskazuje obsługę bezpośrednich hipercalls opróżniania wirtualnego.
18 Wskazuje obsługę funkcji hypercallFlushGuestPhysicalAddressSpace i HvCallFlushGuestPhysicalAddressList (na platformach x64).
19 Wskazuje obsługę korzystania z obsługiwanej mapy bitowej MSR.
20 Wskazuje obsługę łączenia wyjątków wirtualizacji w klasie wyjątków błędów strony.
dwadzieścia jeden Wskazuje obsługę wartości innej niż zero pola 0x00002802 (GuestIa32DebugCtl) w maszynie wirtualnej.
22 Wskazuje obsługę obsługiwanego TLB na platformach AMD. Opróżnienia ASID nie mają wpływu na wpisy TLB pochodzące z serwera NPT. Funkcji Hypercalls należy użyć do unieważnienia wpisów TLB protokołu NPT. Wskazuje również obsługę funkcji hypercallCallFlushGuestPhysicalAddressSpace i HvCallFlushGuestPhysicalAddressList.
31-21 Zarezerwowana
EBX 0 Wskazuje obsługę pól GuestPerfGlobalCtrl i HostPerfGlobalCtrl w obsługującej maszynie wirtualnej.
31-1 Zarezerwowana
ECX Zarezerwowana
EDX Zarezerwowana

Wersjonowanie

Informacje o wersji funkcji hypervisor są kodowane w liściu 0x40000002. Podano dwa numery wersji: wersję główną i wersję usługi.

Wersja główna zawiera numer wersji głównej i pomocniczej oraz numer kompilacji. Odpowiadają one numerom wersji systemu Microsoft Windows. Wersja usługi opisuje zmiany wprowadzone w wersji głównej.

Klienci są zdecydowanie zachęcani do sprawdzania funkcji hypervisor przy użyciu liści 0x400000030x40000005 CPUID, a nie porównywania z zakresami wersji.

Odnajdywanie funkcji i interfejsów (ARM64)

W architekturze ARM64 do odnajdywania funkcji i interfejsu są używane następujące mechanizmy:

  • Zapytania HvRegister za pośrednictwem HvCallGetVpRegisters — używane na potrzeby statycznych funkcji i informacji o wersji.
  • Rejestry mapowane w pamięci — używane do obsługi wartości stanu i kontroli.

Oprócz tych interfejsów specyficznych dla architektury funkcja hypervisor udostępnia prosty interfejs proceduralny zaimplementowany za pomocą funkcji hypercalls.

Odnajdywanie funkcji Hypervisor

Przed użyciem większości interfejsów funkcji hypervisor oprogramowanie powinno najpierw określić, czy działa w środowisku zwirtualizowanym.

W usłudze ARM64 oprogramowanie gościa może odnaleźć funkcję hypervisor przy użyciu standardowego interfejsu SMCCC (SMC Calling Convention). Odnajdywanie jest wykonywane przy użyciu instrukcji HVC lub SMC z identyfikatorem 0xC600FF0 funkcji w X0 (odpowiada to 64-bitowemu wywołaniu funkcji hypervisor specyficznej dla dostawcy, VENDOR_HYP_FUNCTION_CODE_UID). Wywołanie jest zgodne z konwencjami SMCCC, w tym imm16 z 0. Funkcja hypervisor firmy Microsoft zwraca następujące wartości reprezentujące identyfikator GUID 4d32ba58-cd24-4764-8eef-6c7516597024:

Register Wartość
X0 0x4d32ba58
X1 0xcd244764
X2 0x8eef6c75
X3 0x16597024

Po wykryciu funkcji hypervisor oprogramowanie gościa może wykonywać zapytania dotyczące funkcji hypervisor za pomocą rejestrów syntetycznych przy użyciu funkcji hypercallGetVpRegisters HvCallGetVpRegisters . Przed ustawieniem rejestru systemu operacyjnego gościa można wykonywać zapytania dotyczące kilku rejestrów kluczy, co umożliwia wczesne odnajdywanie funkcji funkcji hypervisor podczas rozruchu.

Rejestry funkcji hypervisor

Platformy ARM64 wysyłają zapytania o informacje o funkcji hypervisor za pomocą rejestrów syntetycznych, a nie instrukcji dotyczących identyfikatora CPUID. Te rejestry udostępniają równoważne informacje ich odpowiednikom x64 CPUID i są dostępne za pośrednictwem HvCallGetVpRegisters. Wszystkie rejestry funkcji zwracają wartości 128-bitowe.

Tożsamość systemu funkcji Hypervisor — HvRegisterHypervisorVersion

Zwraca informacje o wersji zakodowane w wartości 128-bitowej. Układ jest identyczny z x64 cpuID liścia 0x40000002, z wartościami rejestru x64 zapakowanymi w wynik 128-bitowy (EAX w bitach 31-0, EBX w bitach 63-32, ECX w bitach 95-64, EDX w bitach 127-96).

Identyfikacja funkcji hypervisor — HvRegisterPrivilegesAndFeaturesInfo

Odpowiednik 0x40000003 liścia x64 CPUID. Wskazuje, które funkcje są dostępne dla partycji na podstawie bieżących uprawnień partycji. Zwraca wartość 128-bitową z następującymi polami:

Bity Podane informacje
31-0 Odpowiada bitom 31-0 HV_PARTITION_PRIVILEGE_MASK
63-32 Odpowiada bitom 63–32 HV_PARTITION_PRIVILEGE_MASK
64 Dostępna jest obsługa debugowania gościa.
65 Dostępna jest obsługa monitora wydajności.
66 Dostępna jest obsługa zdarzeń partycjonowania dynamicznego procesora CPU fizycznego.
67 Dostępna jest obsługa stanu bezczynności wirtualnego gościa.
68 Dostępna jest obsługa stanu uśpienia funkcji hypervisor.
69 Dostępna jest obsługa wykonywania zapytań dotyczących odległości NUMA.
70 Dostępna jest obsługa określania częstotliwości czasomierza.
71 Dostępna jest obsługa wstrzykiwania testów maszyn syntetycznych.
72 Dostępna jest obsługa rejestrów awarii gościa.
73 Zarezerwowane.
74 DisableHypervisorAvailable.
75 Zarezerwowane.
76 SintPollingModeAvailable.
77 Użyj bezpośrednich czasomierzy syntetycznych.
127-78 Zarezerwowane.

Zalecenia dotyczące implementacji — HvRegisterFeaturesInfo

Odpowiednik 0x40000004 liścia cpuID x64. Wskazuje, które zachowanie funkcji hypervisor zaleca zaimplementowanie systemu operacyjnego w celu uzyskania optymalnej wydajności. Zwraca wartość 128-bitową.

Bity Podane informacje
0 UseHvRegisterForReset — w usłudze ARM64 jest to zawsze fałszywe (partycje powinny zamiast tego używać SYSTEM_RESET PSCI).
1 Zalecamy użycie złagodzonego chronometrażu dla tej partycji. Jeśli jest używany, maszyna wirtualna powinna wyłączyć wszelkie limity czasu watchdog, które polegają na terminowym dostarczaniu zewnętrznych przerwań.
2 Zaleca się używanie funkcji Hypercall SyntheticClusterIpi. W usłudze ARM64 jest to fałsz dla partycji głównej (która powinna używać bezpośrednio ICC_SGI1R_EL1) i prawda dla partycji gościa.
3 Zalecamy używanie nowszego interfejsu ExProcessorMasks.
4 Wskazuje, że funkcja hypervisor jest zagnieżdżona w ramach partycji Hyper-V.
5 Wskazuje, że partycja powinna używać stronniczość QueryPerformanceCounter dostarczona przez partycję główną.
20-6 Zarezerwowana
dwadzieścia jeden UseHypercallForMmioAccess
22 UseGpaPinningHypercall
23 WakeVps
25-24 Zarezerwowana
26 MapPartitionEventLogBuffer
31-27 Zarezerwowana
63-32 Zalecana liczba prób ponawiania próby ponowienia błędu spinlock przed powiadomieniem funkcji hypervisor o awariach. 0xFFFFFFFF wskazuje, że nigdy nie powiadamiaj.
127-64 Zarezerwowana

Limity implementacji funkcji Hypervisor — HvRegisterImplementationLimitsInfo

Opisuje limity skalowania obsługiwane w bieżącej implementacji funkcji hypervisor. Jeśli jakakolwiek wartość ma wartość zero, funkcja hypervisor nie uwidacznia odpowiednich informacji. Zwraca wartość 128-bitową z układem identycznym z x64 cpuID liścia 0x40000005, z wartościami rejestru x64 zapakowanymi w wynik 128-bitowy (EAX w bitach 31-0, EBX w bitach 63-32, ECX w bitach 95-64, EDX w bitach 127-96).

Funkcje sprzętu implementacji — HvRegisterHardwareFeaturesInfo

Odpowiednik 0x40000006 liścia cpuID x64. Wskazuje, które funkcje specyficzne dla sprzętu zostały wykryte i są obecnie używane przez funkcję hypervisor. Zwraca wartość 128-bitową.

Bity Podane informacje
0 Obsługa liczników wydajności architektury jest wykrywana i używana.
1 Obsługa translacji adresów drugiego poziomu jest wykrywana i używana.
2 Obsługa ponownego mapowania DMA jest wykrywana i używana.
3 Obsługa ponownego mapowania przerwań jest wykrywana i używana.
4 Wskazuje, że w sprzęcie znajduje się szorer patrolujący pamięci.
5 Ochrona DMA jest używana.
6 Czasomierze syntetyczne są niestabilne.
127-7 Zarezerwowana

Wersjonowanie

Informacje o wersji funkcji hypervisor są kodowane w HvRegisterHypervisorVersion. Format odpowiada odpowiednikowi x64.