Delen via


Virtuele processors

Elke partitie kan nul of meer virtuele processors hebben.

Indexen van virtuele processor

Een virtuele processor wordt geïdentificeerd door een tuple die bestaat uit de partitie-id en de processorindex. De processorindex wordt toegewezen aan de virtuele processor wanneer deze wordt gemaakt en blijft ongewijzigd gedurende de levensduur van de virtuele processor.

Een speciale waarde HV_ANY_VP kan in bepaalde situaties worden gebruikt om 'elke virtuele processor' op te geven. Een waarde van HV_VP_INDEX_SELF kan worden gebruikt om een eigen VP-index op te geven.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

Op x64 Platforms

Op x64-platforms kan de id van een virtuele processor worden opgehaald door de gast via een door een hypervisor gedefinieerde MSR (modelspecifiek register) HV_X64_MSR_VP_INDEX met behulp van RDMSR.

#define HV_X64_MSR_VP_INDEX 0x40000002

Op ARM64-platforms

Op ARM64-platformen kan de id van een virtuele processor worden opgehaald via het synthetische register HvRegisterVpIndex met behulp van de Hypercall HvCallGetVpRegisters. Dit is een alleen-lezen register.

Slaapstatus van virtuele processor inactief (alleen x64)

Op x64-platforms kunnen virtuele processors worden geplaatst in een virtuele niet-actieve processorstroomstatus of de slaapstand van de processor. Dankzij deze verbeterde virtuele inactiviteit kan een virtuele processor die in een niet-actieve toestand met weinig vermogen wordt geplaatst, worden geactiveerd met de komst van een interrupt, zelfs wanneer de interrupt wordt gemaskeerd op de virtuele processor. Met andere woorden, met de virtuele niet-actieve status kan het besturingssysteem in de gastpartitie profiteren van processorkrachtbesparende technieken in het besturingssysteem die anders niet beschikbaar zouden zijn bij het uitvoeren in een gastpartitie.

Een partitie die de bevoegdheid AccessGuestIdleMsr heeft, kan de inactieve slaapstatus van de virtuele processor activeren via een leesbewerking naar de door de hypervisor gedefinieerde MSR HV_X64_MSR_GUEST_IDLE. De virtuele processor wordt geactiveerd wanneer een interrupt binnenkomt, ongeacht of de interrupt is ingeschakeld op de virtuele processor of niet.

Deze functie is niet beschikbaar op ARM64-platforms.

Ondersteuningspagina voor virtuele processor

De hypervisor biedt een pagina per virtuele processor die over de GPA-ruimte van de gast wordt weergegeven. Deze pagina kan worden gebruikt voor bidirectionele communicatie tussen een gast-VP en de hypervisor. Het gast-besturingssysteem heeft lees-/schrijftoegang tot deze virtuele VP Assist-pagina.

De structuur van de pagina VP Assist wordt gedefinieerd in HV_VP_ASSIST_PAGE. Sommige velden binnen deze structuur zijn architectuurspecifiek.

Op x64 Platforms

Op x64-platforms geeft een gast de locatie op van de overlaypagina (in GPA-ruimte) door te schrijven naar de Virtual VP Assist MSR (0x40000073) met behulp van WRMSR. De indeling van de Virtual VP Assist Page MSR is als volgt:

Bits Veld Description
0 Enable Hiermee schakelt u de pagina VP Assist in
11:1 RsvdP Gereserveerd
63:12 PAGINA-PFN Virtual VP Assist Page PFN

Op ARM64-platforms

Op ARM64-platforms geeft een gast de locatie op van de overlaypagina (in GPA-ruimte) door naar het synthetische register hvRegisterVpAssistPage te schrijven met behulp van de HvCallSetVpRegisters hypercall. De registerindeling is identiek aan de x64 MSR-indeling.

Runtime registreren voor virtuele processor

De planner van de hypervisor houdt intern bij hoeveel tijd elke virtuele processor verbruikt bij het uitvoeren van code. De tijd die wordt bijgehouden, is een combinatie van de tijd die de virtuele processor gebruikt om gastcode uit te voeren en de tijd die de bijbehorende logische processor besteedt aan het uitvoeren van hypervisorcode namens die gast. Deze cumulatieve tijd is toegankelijk via een alleen-lezen register. De tijdhoeveelheid wordt gemeten in eenheden van 100ns.

Op x64 Platforms

Op x64-platforms wordt de VP-runtime geopend via de 64-bits alleen-lezen HV_X64_MSR_VP_RUNTIME hypervisor MSR met behulp van RDMSR.

Op ARM64-platforms

Op ARM64-platformen wordt de VP-runtime geopend via het synthetische register HvRegisterVpRuntime met behulp van de Hypercalls HvCallGetVpRegisters. Dit is een alleen-lezen register.

Non-Privileged Instruction Execution Prevention (NPIEP) (alleen x64)

Op x64-platforms is Non-Privileged Instruction Execution Prevention (NPIEP) een functie die het gebruik van bepaalde instructies door gebruikersmoduscode beperkt. Wanneer deze functie is ingeschakeld, kan deze functie de uitvoering van de instructies SIDT, SGDT, SLDT en STR blokkeren. Uitvoering van deze instructies resulteert in een #GP fout.

Deze functie moet per VP worden geconfigureerd met behulp van HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Deze functie is niet beschikbaar op ARM64-platforms.

Gast spinlocks

Een typisch multiprocessorbesturingssysteem maakt gebruik van vergrendelingen voor het afdwingen van atomiciteit van bepaalde bewerkingen. Wanneer u een dergelijk besturingssysteem uitvoert op een virtuele machine die wordt beheerd door de hypervisor, kunnen deze kritieke secties die door vergrendelingen worden beveiligd, worden uitgebreid door snijpunten die worden gegenereerd door de kritieke sectiecode. De kritieke sectiecode kan ook worden voorafgenomen door de hypervisorplanner. Hoewel de hypervisor dergelijke preemptions probeert te voorkomen, kunnen ze optreden. Daarom konden andere slotdeelnemers uiteindelijk draaien totdat de slothouder opnieuw wordt ingepland en daarom de overnametijd van de spinlock aanzienlijk verlengen.

De hypervisor geeft aan dat het gastbesturingssystemen het aantal keren dat een spinlock-overname moet worden uitgevoerd voordat een overmatige spinsituatie aan de hypervisor wordt aangegeven. Dit aantal wordt geretourneerd in het BLAD CPUID-0x40000004. Een waarde van 0 geeft aan dat het gast-besturingssysteem de hypervisor niet op de hoogte moet stellen van het verkrijgen van lange spinlocks.

De HvCallNotifyLongSpinWait hypercall biedt een interface voor verlichte gasten om de statistische billijkheidseigenschap van een vergrendeling voor virtuele machines met meerdere processors te verbeteren. De gast moet deze melding uitvoeren op elk veelvoud van het aanbevolen aantal dat wordt geretourneerd door cpuID leaf 0x40000004. Via deze hypercall meldt een gast de hypervisor van een lange spinlock-overname. Hierdoor kan de hypervisor betere planningsbeslissingen nemen.