Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 lorsqu’il est créé, et il n’est pas modifié pendant 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)
Sur les plateformes x64
Sur les plateformes x64, l’ID d’un processeur virtuel peut être récupéré par l’invité par le biais d’un msR défini par l’hyperviseur (registre spécifique au modèle) HV_X64_MSR_VP_INDEX à l’aide de RDMSR.
#define HV_X64_MSR_VP_INDEX 0x40000002
Sur les plateformes ARM64
Sur les plateformes ARM64, l’ID d’un processeur virtuel peut être récupéré via le registre synthétique HvRegisterVpIndex à l’aide de l’hypercall HvCallGetVpRegisters. Il s’agit d’un registre en lecture seule.
État de veille inactif du processeur virtuel (x64 uniquement)
Sur les plateformes x64, les processeurs virtuels peuvent être placés dans un état d’alimentation du processeur inactif virtuel ou dans un état de veille du processeur. Cet état d’inactivité virtuelle amélioré permet à un processeur virtuel placé dans un état d’inactivité à faible alimentation 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é virtuelle permet au système d’exploitation dans la partition invitée de tirer parti des techniques d’économie d’alimentation du processeur dans le système d’exploitation qui ne seraient pas disponibles dans une partition invitée.
Une partition qui possède le privilège AccessGuestIdleMsr peut déclencher l’entrée dans l’état de veille inactif du processeur virtuel via une lecture sur 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 sur le processeur virtuel ou non.
Cette fonctionnalité n’est pas disponible sur les plateformes ARM64.
Page Assistance 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é dispose d’un accès en lecture/écriture à cette page d’assistance VP virtuel.
La structure de la page d’assistance VP est définie dans HV_VP_ASSIST_PAGE. Certains champs de cette structure sont spécifiques à l’architecture.
Sur les plateformes x64
Sur les plateformes x64, un invité spécifie l’emplacement de la page de superposition (dans l’espace GPA) en écrivant dans virtual VP Assist MSR (0x40000073) à l’aide de WRMSR. Le format du MSR de page d’assistance vp virtuel est le suivant :
| Bits | Terrain | Descriptif |
|---|---|---|
| 0 | Enable | Active la page d’assistance VP |
| 11:1 | RsvdP | Réservé |
| 63:12 | Page PFN | PFN de page VP Assist virtuel |
Sur les plateformes ARM64
Sur les plateformes ARM64, un invité spécifie l’emplacement de la page de superposition (dans l’espace GPA) en écrivant dans le registre synthétique HvRegisterVpAssistPage à l’aide de l’hypercall HvCallSetVpRegisters. Le format de registre est identique au format MSR x64.
Registre du temps d’exécution du processeur virtuel
Le planificateur de l’hyperviseur suit en interne le temps pendant lequel chaque processeur virtuel consomme dans l’exécution du code. Le suivi du temps est une combinaison du temps que le processeur virtuel consomme du code invité et du temps passé par le processeur logique associé à exécuter du code d’hyperviseur pour le compte de cet invité. Cette durée cumulative est accessible via un registre en lecture seule. La quantité de temps est mesurée en 100ns.
Sur les plateformes x64
Sur les plateformes x64, le runtime VP est accessible via les HV_X64_MSR_VP_RUNTIME en lecture seule HV_X64_MSR_VP_RUNTIME hyperviseur MSR à l’aide de RDMSR.
Sur les plateformes ARM64
Sur les plateformes ARM64, le runtime VP est accessible via le registre synthétique HvRegisterVpRuntime à l’aide de l’hypercall HvCallGetVpRegisters. Il s’agit d’un registre en lecture seule.
Prévention de l’exécution d’instructions non privilégiées (NPIEP) (x64 uniquement)
Sur les plateformes x64, la prévention de l’exécution d’instructions non privilégiées (NPIEP) est une fonctionnalité qui limite l’utilisation de certaines instructions par 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.
Cette fonctionnalité n’est pas disponible sur les plateformes ARM64.
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 ces préemptions, elles peuvent se produire. Par conséquent, d’autres concurrents de verrous pourraient finir par tourner jusqu’à ce que le porte-verrou soit de nouveau planifié à nouveau et, par conséquent, étendre considérablement le temps d’acquisition du verrouillage.
L’hyperviseur indique au système d’exploitation invité le nombre de tentatives d’acquisition de verrouillage avant d’indiquer une situation de rotation excessive à l’hyperviseur. Ce nombre est retourné dans la feuille UCID 0x40000004. La valeur 0 indique que le système d’exploitation invité ne doit pas informer l’hyperviseur de l’acquisition de verrouillage long.
L’hypercall HvCallNotifyLongSpinWait fournit une interface permettant aux invités éclairés d’améliorer la propriété d’équité statistique d’un verrou pour les machines virtuelles multiprocesseur. L’invité doit effectuer cette notification sur chaque multiple du nombre recommandé retourné par la feuille UCID 0x40000004. Grâce à cet hypercall, un invité avertit l’hyperviseur d’une acquisition de verrouillage long. Cela permet à l’hyperviseur de prendre de meilleures décisions de planification.