Condividi tramite


Processori virtuali

Ogni partizione può avere zero o più processori virtuali.

Indici del processore virtuale

Un processore virtuale è identificato da una tupla composta dal relativo ID di partizione e dal relativo indice del processore. L'indice del processore viene assegnato al processore virtuale quando viene creato e viene invariato durante la durata del processore virtuale.

Un valore speciale HV_ANY_VP può essere usato in determinate situazioni per specificare "qualsiasi processore virtuale". Un valore di HV_VP_INDEX_SELF può essere usato per specificare un indice VP personalizzato.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

L'ID del processore virtuale può essere recuperato dal guest tramite una HV_X64_MSR_VP_INDEX msr definita dall'hypervisor (registro specifico del modello).

#define HV_X64_MSR_VP_INDEX 0x40000002

Stato di sospensione inattivo del processore virtuale

I processori virtuali possono essere inseriti in uno stato di alimentazione del processore inattivo virtuale o in uno stato di sospensione del processore. Questo stato di inattività virtuale avanzato consente a un processore virtuale inserito in uno stato di inattività di bassa potenza di essere svegliato con l'arrivo di un interruzione anche quando l'interruzione viene mascherata nel processore virtuale. In altre parole, lo stato di inattività virtuale consente al sistema operativo nella partizione guest di sfruttare le tecniche di risparmio energia del processore nel sistema operativo che altrimenti non sarebbero disponibili quando vengono eseguite in una partizione guest.

Una partizione che possiede il privilegio AccessGuestIdleMsr può attivare lo stato di sospensione inattivo del processore virtuale tramite una lettura all'msR HV_X64_MSR_GUEST_IDLEdefinita dall'hypervisor. Il processore virtuale verrà interrotto quando arriva un interruzione, indipendentemente dal fatto che l'interruzione sia abilitata nel processore virtuale o meno.

Pagina Assistenza processore virtuale

L'hypervisor fornisce una pagina per processore virtuale che è sovralaid nello spazio Criteri di gruppo guest. Questa pagina può essere usata per la comunicazione bidirezionale tra una VP guest e l'hypervisor. Il sistema operativo guest ha accesso in lettura/scrittura a questa pagina di assistenza VP virtuale.

Un guest specifica la posizione della pagina di sovrimpressione (nello spazio Criteri di gruppo) scrivendo nel servizio di assistenza vpn virtuale (0x40000073). Il formato di Virtual VP Assist Page MSR è il seguente:

BITS Campo Descrizione
0 Abilita Abilita la pagina di assistenza VP
11:1 RsvdP Riservato
63:12 PFN pagina Pagina PFN di Assistenza VP virtuale

Registrazione del tempo di esecuzione del processore virtuale

L'utilità di pianificazione dell'hypervisor tiene traccia internamente della quantità di tempo utilizzata da ogni processore virtuale nell'esecuzione del codice. Il tempo monitorato è una combinazione del tempo in cui il processore virtuale usa il codice guest in esecuzione e il tempo in cui il processore logico associato spende l'esecuzione del codice hypervisor per conto di tale guest. Questo tempo cumulativo è accessibile tramite l'HV_X64_MSR_VP_RUNTIME MSR a 64 bit di sola lettura. La quantità di tempo viene misurata in 100 unità.

Prevenzione dell'esecuzione delle istruzioni non con privilegi (NPIEP)

L'esecuzione di istruzioni non con privilegi (NPIEP) è una funzionalità che limita l'uso di determinate istruzioni in base al codice in modalità utente. In particolare, se abilitata, questa funzionalità può bloccare l'esecuzione delle istruzioni SIDT, SGDT, SLDT e STR. L'esecuzione di queste istruzioni comporta un errore di #GP.

Questa funzionalità deve essere configurata su base vp usando HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Spinlock guest

Un tipico sistema operativo con funzionalità multiprocessore usa i blocchi per applicare l'atomicità di determinate operazioni. Quando si esegue tale sistema operativo all'interno di una macchina virtuale controllata dall'hypervisor queste sezioni critiche protette da blocchi possono essere estese da intercettazioni generate dal codice di sezione critico. Il codice della sezione critica può anche essere preceduto dall'utilità di pianificazione dell'hypervisor. Anche se l'hypervisor tenta di prevenire tali preemptions, possono verificarsi. Di conseguenza, altri contendenti di blocco potrebbero finire a ruotare fino a quando il titolare del blocco è nuovamente pianificato e quindi estendere significativamente il tempo di acquisizione del spinlock.

L'hypervisor indica al sistema operativo guest il numero di volte in cui è necessario tentare l'acquisizione di spinlock prima di indicare una situazione di spin eccessiva all'hypervisor. Questo conteggio viene restituito nella foglia CPUID 0x40000004. Un valore 0 indica che il sistema operativo guest non deve notificare all'hypervisor l'acquisizione di spinlock lunghi.

L'hypercall HvCallNotifyLongSpinWait fornisce un'interfaccia per gli ospiti illuminati per migliorare la proprietà statistica di equità di un blocco per le macchine virtuali multiprocessore. Il guest deve effettuare questa notifica su ogni numero di conteggio consigliato restituito dalla foglia CPUID 0x40000004. Tramite questa hypercall, un guest notifica all'hypervisor di un'acquisizione long spinlock. Ciò consente all'hypervisor di prendere decisioni di pianificazione migliori.