Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Każda partycja może mieć zero lub więcej procesorów wirtualnych.
Indeksy procesora wirtualnego
Procesor wirtualny jest identyfikowany przez krotkę składającą się z identyfikatora partycji i indeksu procesora. Indeks procesora jest przypisywany do procesora wirtualnego podczas jego tworzenia i pozostaje niezmieniony przez okres istnienia procesora wirtualnego.
W niektórych sytuacjach można użyć specjalnej wartości HV_ANY_VP do określenia "dowolnego procesora wirtualnego". Wartość HV_VP_INDEX_SELF może służyć do określania własnego indeksu VP.
typedef UINT32 HV_VP_INDEX;
#define HV_ANY_VP ((HV_VP_INDEX)-1)
#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)
Na platformach x64
Na platformach x64 identyfikator procesora wirtualnego można pobrać przez gościa za pośrednictwem rejestru msR zdefiniowanego przez funkcję hypervisor (rejestru specyficznego dla modelu) HV_X64_MSR_VP_INDEX przy użyciu rdMSR.
#define HV_X64_MSR_VP_INDEX 0x40000002
Na platformach ARM64
Na platformach ARM64 identyfikator procesora wirtualnego można pobrać za pośrednictwem rejestru syntetycznego HvRegisterVpIndex przy użyciu funkcji hypercallGetVpRegisters HvCallGetVpRegisters. Jest to rejestr tylko do odczytu.
Stan uśpienia bezczynności procesora wirtualnego (tylko x64)
Na platformach x64 procesory wirtualne mogą być umieszczane w stanie bezczynności procesora wirtualnego lub w stanie uśpienia procesora. Ten rozszerzony stan bezczynności wirtualnej pozwala procesorowi wirtualnemu, który jest umieszczony w stanie bezczynności zasilania, zostanie wybudzony z nadejściem przerwania nawet wtedy, gdy przerwanie jest maskowane na procesorze wirtualnym. Innymi słowy, stan bezczynności wirtualnej umożliwia systemowi operacyjnemu w partycji gościa korzystanie z technik oszczędzania mocy procesora w systemie operacyjnym, które w przeciwnym razie byłyby niedostępne podczas uruchamiania w partycji gościa.
Partycja, która ma uprawnienie AccessGuestIdleMsr, może wyzwolić wpis w stanie uśpienia bezczynności procesora wirtualnego za pośrednictwem odczytu do zdefiniowanego przez funkcję hypervisor msR HV_X64_MSR_GUEST_IDLE. Procesor wirtualny zostanie wybudzony po nadejściu przerwania, niezależnie od tego, czy przerwanie jest włączone na procesorze wirtualnym, czy nie.
Ta funkcja nie jest dostępna na platformach ARM64.
Strona asysty procesora wirtualnego
Funkcja hypervisor udostępnia stronę na procesor wirtualny, który jest nakładany na miejsce gpa gościa. Ta strona może służyć do dwukierunkowej komunikacji między wiceprezesem gościa a funkcją hypervisor. System operacyjny gościa ma dostęp do odczytu/zapisu na tej wirtualnej stronie pomocy vp.
Struktura strony pomocy vp jest definiowana w HV_VP_ASSIST_PAGE. Niektóre pola w tej strukturze są specyficzne dla architektury.
Na platformach x64
Na platformach x64 gość określa lokalizację strony nakładki (w obszarze GPA) przez zapisanie w wirtualnej usłudze VP Assist MSR (0x40000073) przy użyciu usługi WRMSR. Format wirtualnej strony asystowania vp assist msR jest następujący:
| Bity | (No changes needed) | Description |
|---|---|---|
| 0 | Enable | Włącza stronę pomocy vp assist |
| 11:1 | RsvdP | Zarezerwowana |
| 63:12 | Nazwa PFN strony | Virtual VP Assist Page PFN |
Na platformach ARM64
Na platformach ARM64 gość określa lokalizację strony nakładki (w obszarze GPA), pisząc do rejestru syntetycznego HvRegisterVpAssistPage przy użyciu funkcji hypercallSetVpRegisters. Format rejestru jest identyczny z formatem MSR x64.
Rejestrowanie czasu wykonywania procesora wirtualnego
Harmonogram funkcji hypervisor wewnętrznie śledzi, ile czasu każdy procesor wirtualny zużywa podczas wykonywania kodu. Śledzony czas jest kombinacją czasu, przez który procesor wirtualny zużywa uruchomiony kod gościa, a czas, w którym skojarzony procesor logiczny spędza uruchomiony kod funkcji hypervisor w imieniu tego gościa. Ten skumulowany czas jest dostępny za pośrednictwem rejestru tylko do odczytu. Ilość czasu jest mierzona w jednostkach 100ns.
Na platformach x64
Na platformach x64 środowisko uruchomieniowe vp jest dostępne za pośrednictwem 64-bitowego HV_X64_MSR_VP_RUNTIME funkcji hypervisor MSR przy użyciu rdMSR.
Na platformach ARM64
Na platformach ARM64 środowisko uruchomieniowe vp jest dostępne za pośrednictwem rejestru syntetycznego HvRegisterVpRuntime przy użyciu funkcji hypercallGetVpRegisters HvCallGetVpRegisters. Jest to rejestr tylko do odczytu.
Zapobieganie wykonywaniu instrukcji innych niż uprzywilejowane (NPIEP) (tylko x64)
Na platformach x64 zapobieganie wykonywaniu instrukcji nieuprzywilejowanych (NPIEP) to funkcja ograniczająca korzystanie z określonych instrukcji przez kod trybu użytkownika. W szczególności po włączeniu tej funkcji można zablokować wykonywanie instrukcji SIDT, SGDT, SLDT i STR. Wykonanie tych instrukcji powoduje wystąpienie błędu #GP.
Ta funkcja musi być skonfigurowana dla poszczególnych wiceprezesów przy użyciu HV_X64_MSR_NPIEP_CONFIG_CONTENTS.
Ta funkcja nie jest dostępna na platformach ARM64.
Spinlocks gościa
Typowy wieloprocesorowy system operacyjny używa blokad w celu wymuszania niepodzielności niektórych operacji. W przypadku uruchamiania takiego systemu operacyjnego wewnątrz maszyny wirtualnej kontrolowanej przez funkcję hypervisor te krytyczne sekcje chronione przez blokady mogą być rozszerzone przez przechwyty generowane przez krytyczny kod sekcji. Kod sekcji krytycznej może być również poprzedzony harmonogramem funkcji hypervisor. Mimo że funkcja hypervisor próbuje zapobiec takim wywłaszczaniu, mogą wystąpić. W związku z tym inni pretendenci do blokady mogą skończyć się przędzenia, dopóki uchwyt blokady zostanie ponownie zaplanowany ponownie, a tym samym znacznie przedłużyć czas nabycia spinlock.
Funkcja hypervisor wskazuje systemowi operacyjnemu gościa liczbę prób uzyskania spinlock przed wskazaniem nadmiernej sytuacji spinvisor. Ta liczba jest zwracana w 0x40000004 liścia CPUID. Wartość 0 wskazuje, że system operacyjny gościa nie powinien powiadamiać funkcji hypervisor o długim nabyciu blokady spinlock.
HvCallNotifyLongSpinWait hypercall zapewnia interfejs dla oświeconych gości w celu poprawy statystycznej właściwości sprawiedliwości blokady dla maszyn wirtualnych wieloprocesorowych. Gość powinien powiadomić o każdej wielokrotności zalecanej liczby zwróconej przez 0x40000004 liścia CPUID. Za pośrednictwem tej funkcji hypercall gość powiadamia funkcję hypervisor o długim nabyciu spinlocka. Dzięki temu funkcja hypervisor może podejmować lepsze decyzje dotyczące planowania.