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.
L’hyperviseur fournit des services de minutage simples. Elles sont basées sur une source de temps de référence à taux constant (généralement le minuteur ACPI sur les systèmes x64).
Les services de minuteur suivants sont fournis :
- Compteur de temps de référence par partition.
- Quatre minuteurs synthétiques par processeur virtuel. Chaque minuteur synthétique est un minuteur unique ou périodique qui remet un message ou affirme une interruption lorsqu’il expire.
- Un minuteur APIC virtuel par processeur virtuel.
- Éclairage du temps de référence de partition, basé sur la prise en charge de la plateforme hôte pour un compteur d’horodatage invariant (iTSC).
Compteur de référence
L’hyperviseur gère un compteur de temps de référence par partition. Il a la caractéristique que les accès successifs à celui-ci retournent strictement des valeurs d’augmentation monotonique (temps) comme indiqué par tous les processeurs virtuels d’une partition. En outre, le compteur de référence est constant et n’est pas affecté par les transitions de vitesse de processeur ou de bus ou les états d’économie d’énergie du processeur profond. Le compteur de temps de référence d’une partition est initialisé à zéro lors de la création de la partition. Le compteur de référence pour tous les partitions compte à la même vitesse, mais à tout moment, leurs valeurs absolues diffèrent généralement, car les partitions ont des temps de création différents.
Le compteur de référence continue de compter jusqu’à ce qu’au moins un processeur virtuel ne soit pas explicitement suspendu.
Registre du compteur de référence de partition
Sur les plateformes x64
Sur les plateformes x64, le compteur de référence d’une partition est accessible via un MSR à l’échelle de la partition.
| Adresse MSR | Nom de l’inscription | Descriptif |
|---|---|---|
| 0x40000020 | HV_X64_MSR_TIME_REF_COUNT | Nombre de références temporelles (à l’échelle de la partition) |
Sur les plateformes ARM64
Sur les plateformes ARM64, le compteur de référence d’une partition est accessible via le registre synthétique HvRegisterTimeRefCount à l’aide des hypercalls HvCallGetVpRegisters et HvCallSetVpRegisters.
| Nom de l’inscription | Descriptif |
|---|---|
| HvRegisterTimeRefCount | Nombre de références temporelles (à l’échelle de la partition) |
Comportement d’inscription
Lorsqu’une partition est créée, la valeur du registre du compteur de référence est définie sur 0x0000000000000000. Cette valeur ne peut pas être modifiée par un processeur virtuel. Sur les plateformes x64, toute tentative d’écriture dans le MSR entraîne une erreur #GP. Sur les plateformes ARM64, les tentatives d’écriture via HvCallSetVpRegisters retournent HV_STATUS_INVALID_PARAMETER.
Éclairage du temps de référence de partition
L’éclairage du temps de référence de partition présente une source de temps de référence à une partition qui ne nécessite pas d’interception dans l’hyperviseur. Cette lumière n’est disponible que lorsque la plateforme sous-jacente prend en charge un compteur d’horodatage de processeur invariant (TSC) ou iTSC. Dans ces plateformes, la fréquence TSC du processeur reste constante, quelle que soit la fréquence d’horloge du processeur en raison de l’utilisation d’états de gestion de l’alimentation tels que les états de performances du processeur ACPI, les états de veille inactif du processeur (états ACPI C), etc.
L’éclairage du temps de référence de partition utilise une valeur TSC virtuelle, un décalage et un multiplicateur pour permettre à une partition invitée de calculer l’heure de référence normalisée depuis la création de la partition, en unités 100nS. Le mécanisme permet également à une partition invitée de calculer atomiquement l’heure de référence lorsque la partition invitée est migrée vers une plateforme avec un taux TSC différent et fournit un mécanisme de secours pour prendre en charge la migration vers les plateformes sans la fonctionnalité TSC à taux constant.
Cette installation n’est pas destinée à être utilisée comme source d’horloge murale, car l’heure de référence calculée à l’aide de cette installation semble s’arrêter pendant le temps d’enregistrement d’une partition invité jusqu’à la restauration suivante.
Page compteur d’horodatage de référence de partition
L’hyperviseur fournit une page TSC de référence virtuelle à l’échelle de la partition qui est superposée sur l’espace GPA de la partition. La page du compteur d’horodatage de référence d’une partition est accessible via le MSR TSC de référence.
La page TSC de référence est définie à l’aide de la structure suivante :
typedef struct
{
volatile UINT32 TscSequence;
UINT32 Reserved1;
volatile UINT64 TscScale;
volatile INT64 TscOffset;
UINT64 Reserved2[509];
} HV_REFERENCE_TSC_PAGE;
Registre du compteur d’horodatage de référence (TSC)
Un invité souhaitant accéder à sa page TSC de référence doit utiliser un registre synthétique. Une partition qui possède le privilège AccessPartitionReferenceTsc peut accéder au registre.
Sur les plateformes x64
Sur les plateformes x64, la page TSC de référence est accessible via un MSR.
| Adresse MSR | Nom de l’inscription | Descriptif |
|---|---|---|
| 0x40000021 | HV_X64_MSR_REFERENCE_TSC | Page TSC de référence |
Sur les plateformes ARM64
Sur les plateformes ARM64, la page TSC de référence est accessible via le registre synthétique HvRegisterReferenceTsc à l’aide des hypercalls HvCallGetVpRegisters et HvCallSetVpRegisters.
| Nom de l’inscription | Descriptif |
|---|---|
| HvRegisterReferenceTsc | Page TSC de référence |
Inscrire la disposition
| Bits | Descriptif | Attributes |
|---|---|---|
| 63:12 | Numéro de page GPA | Lecture/écriture |
| 11:1 | RsvdP (la valeur doit être conservée) | Lecture/écriture |
| 0 | Enable | Lecture/écriture |
Au moment de la création de la partition invitée, la valeur du MSR TSC de référence est 0x0000000000000000. Par conséquent, la page TSC de référence est désactivée par défaut. L’invité doit activer la page TSC de référence en définissant le bit 0. Si l’adresse de base spécifiée dépasse la fin de l’espace GPA de la partition, la page TSC de référence n’est pas accessible à l’invité. Lors de la modification du registre, les invités doivent conserver la valeur des bits réservés (1 à 11) pour une compatibilité future.
Mécanisme TSC de référence de partition
Le temps de référence de la partition est calculé par la formule suivante :
ReferenceTime = ((VirtualTsc * TscScale) >> 64) + TscOffset
La multiplication est une multiplication 64 bits, ce qui entraîne un nombre de 128 bits qui est ensuite décalé 64 fois à droite pour obtenir les 64 bits élevés.
La valeur TscScale est utilisée pour ajuster la valeur TSC virtuelle entre les événements de migration afin d’atténuer les changements de fréquence TSC d’une plateforme à une autre.
La valeur TscSequence est utilisée pour synchroniser l’accès au temps de référence éclairé si l’échelle et/ou les champs de décalage sont modifiés pendant l’enregistrement/restauration ou la migration dynamique. Ce champ sert de numéro de séquence qui est incrémenté chaque fois que les champs de mise à l’échelle et/ou de décalage sont modifiés. Une valeur spéciale de 0x0 est utilisée pour indiquer que cette installation n’est plus une source fiable de temps de référence et que la machine virtuelle doit revenir à une autre source.
Le code recommandé pour l’informatique du temps de référence de partition à l’aide de cet éclairage est illustré ci-dessous :
do
{
StartSequence = ReferenceTscPage->TscSequence;
if (StartSequence == 0)
{
// 0 means that the Reference TSC enlightenment is not available at
// the moment, and the Reference Time can only be obtained from
// reading the Reference Counter MSR.
ReferenceTime = rdmsr(HV_X64_MSR_TIME_REF_COUNT);
return ReferenceTime;
}
Tsc = rdtsc();
// Assigning Scale and Offset should neither happen before
// setting StartSequence, nor after setting EndSequence.
Scale = ReferenceTscPage->TscScale;
Offset = ReferenceTscPage->TscOffset;
EndSequence = ReferenceTscPage->TscSequence;
} while (EndSequence != StartSequence);
// The result of the multiplication is treated as a 128-bit value.
ReferenceTime = ((Tsc * Scale) >> 64) + Offset;
return ReferenceTime;
Minuteurs synthétiques
Les minuteurs synthétiques fournissent un mécanisme permettant de générer une interruption après un certain temps spécifié à l’avenir. Les minuteurs ponctuels et périodiques sont pris en charge. Un minuteur synthétique envoie un message à un SYNIC SINTx spécifié (source d’interruption synthétique) lors de l’expiration, ou affirme une interruption, selon la façon dont elle est configurée.
L’hyperviseur garantit qu’un signal d’expiration du minuteur ne sera jamais remis avant l’heure d’expiration. Le signal peut arriver à tout moment après l’heure d’expiration.
Minuteurs périodiques
L’hyperviseur tente de signaler régulièrement des minuteurs périodiques. Toutefois, si le processeur virtuel utilisé pour signaler l’expiration n’est pas disponible, certaines expirations du minuteur peuvent être retardées. Un processeur virtuel peut être indisponible, car il est suspendu (par exemple, pendant la gestion de l’interception) ou parce que le planificateur de l’hyperviseur a décidé que le processeur virtuel ne doit pas être planifié sur un processeur logique (par exemple, parce qu’un autre processeur virtuel utilise le processeur logique ou que le processeur virtuel a dépassé son quota).
Si un processeur virtuel n’est pas disponible pendant une période suffisamment longue, une période de temps plein peut être manquée. Dans ce cas, l’hyperviseur utilise l’une des deux techniques.
La première technique consiste à moduler la période du minuteur, en raccourcissant la période jusqu’à ce que le minuteur « rattrape ». Si un nombre important de signaux du minuteur ont été manqués, l’hyperviseur peut être incapable de compenser à l’aide de la modulation de période. Dans ce cas, certains signaux d’expiration du minuteur peuvent être ignorés complètement.
Pour les minuteurs marqués comme différés, l’hyperviseur utilise une deuxième technique pour gérer la situation dans laquelle un processeur virtuel n’est pas disponible pendant une longue période. Dans ce cas, le signal du minuteur est différé jusqu’à ce que ce processeur virtuel soit disponible. S’il n’est pas disponible avant l’expiration du minuteur suivant, il est ignoré entièrement.
Classement des expirations du minuteur
Les minuteurs synthétiques et virtualisés génèrent des interruptions à ou près de leur heure d’expiration désignée. En raison d’interactions matérielles et d’autres interactions de planification, les interruptions peuvent potentiellement être retardées. Aucun ordre ne peut être pris en compte entre n’importe quel ensemble de minuteurs.
Minuteurs synthétiques directs
Les minuteurs synthétiques « direct » affirment une interruption lors de l’expiration du minuteur au lieu d’envoyer un message à une source d’interruption synthétique SynIc. Un minuteur synthétique est défini sur le mode « direct » en définissant le champ « DirectMode » du MSR de configuration du minuteur synthétique. Le champ « ApicVector » contrôle le vecteur d’interruption qui est déclaré lors de l’expiration du minuteur.
Registres du minuteur synthétique
Les minuteurs synthétiques sont configurés à l’aide de registres synthétiques associés à chaque processeur virtuel. Chacun des quatre minuteurs synthétiques a une paire associée de registres (configuration et nombre).
Sur les plateformes x64
Sur les plateformes x64, les minuteurs synthétiques sont accessibles via des MSR à l’aide des instructions RDMSR et WRMSR.
| Adresse MSR | Nom de l’inscription | Descriptif |
|---|---|---|
| 0x400000B0 | HV_X64_MSR_STIMER0_CONFIG | Inscription de configuration pour le minuteur synthétique 0. |
| 0x400000B1 | HV_X64_MSR_STIMER0_COUNT | Délai d’expiration ou période pour le minuteur synthétique 0. |
| 0x400000B2 | HV_X64_MSR_STIMER1_CONFIG | Inscription de configuration pour le minuteur synthétique 1. |
| 0x400000B3 | HV_X64_MSR_STIMER1_COUNT | Délai d’expiration ou période pour le minuteur synthétique 1. |
| 0x400000B4 | HV_X64_MSR_STIMER2_CONFIG | Inscription de configuration pour le minuteur synthétique 2. |
| 0x400000B5 | HV_X64_MSR_STIMER2_COUNT | Délai d’expiration ou période pour le minuteur synthétique 2. |
| 0x400000B6 | HV_X64_MSR_STIMER3_CONFIG | Registre de configuration pour le minuteur synthétique 3. |
| 0x400000B7 | HV_X64_MSR_STIMER3_COUNT | Délai d’expiration ou période pour le minuteur synthétique 3. |
Sur les plateformes ARM64
Sur les plateformes ARM64, les minuteurs synthétiques sont accessibles via des registres synthétiques à l’aide des hypercalls HvCallGetVpRegisters et HvCallSetVpRegisters.
| Nom de l’inscription | Descriptif |
|---|---|
| HvRegisterStimer0Config | Inscription de configuration pour le minuteur synthétique 0. |
| HvRegisterStimer0Count | Délai d’expiration ou période pour le minuteur synthétique 0. |
| HvRegisterStimer1Config | Inscription de configuration pour le minuteur synthétique 1. |
| HvRegisterStimer1Count | Délai d’expiration ou période pour le minuteur synthétique 1. |
| HvRegisterStimer2Config | Inscription de configuration pour le minuteur synthétique 2. |
| HvRegisterStimer2Count | Délai d’expiration ou période pour le minuteur synthétique 2. |
| HvRegisterStimer3Config | Registre de configuration pour le minuteur synthétique 3. |
| HvRegisterStimer3Count | Délai d’expiration ou période pour le minuteur synthétique 3. |
Note: Sur ARM64, les minuteurs synthétiques sont facultatifs, car le minuteur générique ARM (GIT) peut être utilisé directement sans entraîner de surcharge de virtualisation. Les systèmes d’exploitation invités doivent préférer utiliser le minuteur générique architectural pour améliorer les performances.
Inscrire la disposition
Registre de configuration du minuteur synthétique
| Bits | Descriptif | Attributes |
|---|---|---|
| 63:20 | RsvdZ (la valeur doit être définie sur zéro) | Lecture/écriture |
| 19:16 | SINTx - Source d’interruption synthétique | Lecture/écriture |
| 15:13 | RsvdZ (la valeur doit être définie sur zéro) | Lecture/écriture |
| 12 | Mode direct - Assertion et interruption lors de l’expiration du minuteur. | Lecture/écriture |
| 11:4 | ApicVector : contrôle le vecteur d’interruption déclaré en mode direct | Lecture/écriture |
| 3 | AutoEnable : définir si l’écriture du compteur correspondant provoque implicitement l’activation du minuteur | Lecture/écriture |
| 2 | Paresseux - Définir si le minuteur est différé | Lecture/écriture |
| 1 | Périodique - Définir si le minuteur est périodique | Lecture/écriture |
| 0 | Activé : définir si le minuteur est activé | Lecture/écriture |
Lorsqu’un processeur virtuel est créé et réinitialisé, la valeur de tous les registres de configuration du minuteur synthétique (HV_X64_MSR_STIMER0_CONFIG via HV_X64_MSR_STIMER3_CONFIG) est définie sur 0x0000000000000000. Ainsi, tous les minuteurs synthétiques sont désactivés par défaut.
Si AutoEnable est défini, l’écriture d’une valeur différente de zéro dans le registre de nombre correspondant entraîne la définition de l’option Activer et l’activation du compteur. Sinon, l’option Activer doit être définie après avoir écrit le registre de nombre correspondant pour activer le compteur. Pour plus d’informations sur le registre Count, consultez la section suivante.
Lorsqu’un minuteur à un coup expire, il est automatiquement marqué comme désactivé. Les minuteurs périodiques restent activés jusqu’à ce qu’ils ne sont pas explicitement désactivés.
Si une capture est activée et que le nombre spécifié est dans le passé, il expire immédiatement.
Il n’est pas autorisé à définir le champ SINTx sur zéro pour un minuteur activé (qui n’est pas en mode direct). En cas de tentative, le minuteur est marqué désactivé (autrement dit, bit 0 effacé) immédiatement.
L’écriture du registre de configuration d’un minuteur déjà activé peut entraîner un comportement non défini. Par exemple, la modification d’un minuteur d’un coup à périodique peut ne pas produire ce qui est prévu. Les minuteurs doivent toujours être désactivés avant de modifier les autres propriétés.
Registre du nombre de minuteurs synthétiques
| Bits | Descriptif | Attributes |
|---|---|---|
| 63:0 | Nombre : délai d’expiration pour les minuteurs à un coup, durée pour les minuteurs périodiques | Lecture/écriture |
La valeur programmée dans le registre Count est une valeur de temps mesurée en 100 nanosecondes. L’écriture de la valeur zéro dans le registre Count arrête le compteur, ce qui désactive le minuteur, indépendamment du paramètre AutoEnable dans le registre de configuration.
Notez que le registre Count est autorisé à encapsuler. L’habillage n’a aucun effet sur le comportement du minuteur, quelle que soit la propriété du minuteur.
Pour les minuteurs à un coup, il représente l’heure d’expiration absolue du minuteur. Le minuteur expire lorsque le compteur de référence de la partition est égal ou supérieur à la valeur de nombre spécifiée.
Pour les minuteurs périodiques, le nombre représente la période du minuteur. La première période commence lorsque le minuteur synthétique est activé.
Message d’expiration du minuteur synthétique
Les messages d’expiration du minuteur sont envoyés lorsqu’un événement de minuteur se déclenche. Reportez-vous à la HV_TIMER_MESSAGE_PAYLOAD pour la définition de la charge utile du message.
Registres du minuteur de Time-Unhalted synthétique
Les registres de minuteur de Time-Unhalted synthétiques sont disponibles sur les plateformes x64 si une partition dispose du privilège AccessSyntheticTimerRegs. La disponibilité est indiquée par EDX bit 23 dans la feuille UCID d’identification des fonctionnalités hyperviseur 0x40000003. Cette fonctionnalité n’est pas disponible sur les plateformes ARM64.
Les logiciels invités peuvent programmer le minuteur synthétique non expiré pour générer une interruption périodique après l’exécution d’une durée spécifiée en unités de 100ns. Lorsque l’interruption se déclenche, le champ SyntheticTimeUnhaltedTimerExpired dans la page d’assistance VP est défini sur TRUE. Le logiciel invité peut réinitialiser ce champ sur FALSE. Contrairement aux compteurs de performances architecturaux, le minuteur synthétique n’est jamais réinitialisé par l’hyperviseur et s’exécute en continu entre les interruptions. Si le champ Vector est défini sur 2 (vecteur NMI x64), le minuteur remet une interruption non masquable ; sinon, il remet une interruption fixe à l’aide du vecteur spécifié.
Contrairement aux minuteurs synthétiques réguliers qui accumulent le temps lorsque l’invité s’est arrêté (c’est-à-dire inactif), le minuteur de Time-Unhalted synthétique accumule le temps uniquement pendant que l’invité n’est pas arrêté.
Sur les plateformes x64
Sur les plateformes x64, le minuteur synthétique non expiré est accessible via des MSR à l’aide des instructions RDMSR et WRMSR.
| Adresse MSR | Nom de l’inscription | Descriptif |
|---|---|---|
| 0x40000114 | HV_X64_MSR_STIME_UNHALTED_TIMER_CONFIG | Configuration du minuteur de Time-Unhalted synthétique |
| 0x40000115 | HV_X64_MSR_STIME_UNHALTED_TIMER_COUNT | Nombre de minuteurs de Time-Unhalted synthétiques |
Inscrire la disposition
Registre de configuration du minuteur de Time-Unhalted synthétique
| Bits | Descriptif | Attributes |
|---|---|---|
| 63:9 | RsvdZ (la valeur doit être définie sur zéro) | Lecture/écriture |
| 8 | Enabled | Lecture/écriture |
| 7:0 | Vector | Lecture/écriture |
Le champ Vector doit être 2 (pour fournir une NMI) ou une valeur ≥ 16 (pour fournir une interruption fixe). Les autres valeurs ne sont pas valides.
Registre du nombre de minuteurs de Time-Unhalted synthétiques
| Bits | Descriptif | Attributes |
|---|---|---|
| 63:0 | Taux périodique d’interruptions en unités de 100 ns | Lecture/écriture |