Partager via


Processeurs virtuels

Chaque partition peut avoir zéro ou plusieurs processeurs virtuels.

Index de processeur virtuel

Un processeur virtuel est identifié par un tuple composé de son ID de partition et de son index de processeur. L’index du processeur est affecté au processeur virtuel lors de sa création, et il est inchangé tout au long de la durée de vie du processeur virtuel.

Une valeur spéciale HV_ANY_VP peut être utilisée dans certaines situations pour spécifier « n’importe quel processeur virtuel ». Une valeur de HV_VP_INDEX_SELF peut être utilisée pour spécifier son propre index VP.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

L’ID d’un processeur virtuel peut être récupéré par l’invité via un msr (registre spécifique au modèle) défini par l’hyperviseur HV_X64_MSR_VP_INDEX.

#define HV_X64_MSR_VP_INDEX 0x40000002

État de veille inactif du processeur virtuel

Les processeurs virtuels peuvent être placés dans un état d’alimentation du processeur inactif virtuel ou dans un état de mise en veille du processeur. Cet état d’inactivité virtuel amélioré permet à un processeur virtuel placé dans un état d’inactivité à faible consommation d’être réveillé avec l’arrivée d’une interruption même lorsque l’interruption est masquée sur le processeur virtuel. En d’autres termes, l’état d’inactivité virtuel permet au système d’exploitation de la partition invité de tirer parti des techniques d’économie d’énergie du processeur dans le système d’exploitation qui ne seraient sinon pas disponibles lors de l’exécution dans une partition invitée.

Une partition qui possède le privilège AccessGuestIdleMsr peut déclencher une entrée dans l’état d’inactivité du processeur virtuel par le biais d’une lecture dans le MSR HV_X64_MSR_GUEST_IDLEdéfini par l’hyperviseur . Le processeur virtuel est réveillé lorsqu’une interruption arrive, que l’interruption soit activée ou non sur le processeur virtuel.

Page Assistant du processeur virtuel

L’hyperviseur fournit une page par processeur virtuel qui est superposée sur l’espace GPA invité. Cette page peut être utilisée pour la communication bidirectionnelle entre un VP invité et l’hyperviseur. Le système d’exploitation invité a accès en lecture/écriture à cette page d’assistance VP virtuelle.

Un invité spécifie l’emplacement de la page de superposition (dans l’espace GPA) en écrivant dans virtual VP Assist MSR (0x40000073). Le format de la page Virtual VP Assist Page MSR est le suivant :

Bits Champ Description
0 Activer Active la page d’assistance VP
11:1 RsvdP Réservé
63:12 Page PFN PFN de la page d’assistance vp virtuelle

Registre du temps d’exécution du processeur virtuel

Le planificateur de l’hyperviseur suit en interne la durée consommée par chaque processeur virtuel dans l’exécution du code. Le suivi est une combinaison de la durée pendant laquelle le processeur virtuel consomme le code invité en cours d’exécution et du temps que le processeur logique associé passe à exécuter le code de l’hyperviseur pour le compte de cet invité. Ce temps cumulé est accessible via le msr de l’hyperviseur 64 bits 64 bits HV_X64_MSR_VP_RUNTIME. La quantité de temps est mesurée en unités 100n.

Prévention de l’exécution des instructions non privilégiées (NPIEP)

L’exécution d’instructions non privilégiées (NPIEP) est une fonctionnalité qui limite l’utilisation de certaines instructions par le code en mode utilisateur. Plus précisément, lorsqu’elle est activée, cette fonctionnalité peut bloquer l’exécution des instructions SIDT, SGDT, SLDT et STR. L’exécution de ces instructions entraîne une erreur #GP.

Cette fonctionnalité doit être configurée par vp à l’aide de HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Spinlocks invités

Un système d’exploitation multiprocesseur classique utilise des verrous pour appliquer l’atomicité de certaines opérations. Lors de l’exécution d’un tel système d’exploitation à l’intérieur d’une machine virtuelle contrôlée par l’hyperviseur, ces sections critiques protégées par des verrous peuvent être étendues par des intercepts générés par le code de section critique. Le code de section critique peut également être préempté par le planificateur d’hyperviseur. Bien que l’hyperviseur tente d’empêcher de telles préemptions, elles peuvent se produire. Par conséquent, d’autres prétendants au verrouillage pourraient finir par tourner jusqu’à ce que le porte-verrou soit à nouveau planifié et, par conséquent, prolonger considérablement le temps d’acquisition de spinlock.

L’hyperviseur indique au système d’exploitation invité le nombre de tentatives d’acquisition d’un spinlock avant d’indiquer une situation de rotation excessive à l’hyperviseur. Ce nombre est retourné dans le 0x40000004 feuille CPUID. La valeur 0 indique que le système d’exploitation invité ne doit pas informer l’hyperviseur de l’acquisition de long spinlock.

L’hypercall HvCallNotifyLongSpinWait fournit une interface permettant aux invités éclairés d’améliorer la propriété d’impartialité statistique d’un verrou pour les machines virtuelles multiprocesseurs. L’invité doit effectuer cette notification sur chaque multiple du nombre recommandé retourné par les 0x40000004 feuilles CPUID. Grâce à cet hypercall, un invité avertit l’hyperviseur d’une acquisition de long spinlock. Cela permet à l’hyperviseur de prendre de meilleures décisions de planification.