Partager via


communication Inter-Partition

L’hyperviseur fournit deux mécanismes simples pour qu’une partition communique avec une autre : les messages et les événements. Dans les deux cas, la notification est signalée à l’aide du synIC (contrôleur d’interruption synthétique).

SynIC Messages

L’hyperviseur fournit une facilité de communication entre partitions simple qui permet à une partition d’envoyer un message paramétrable à une autre partition. (Étant donné que le message est envoyé de façon asynchrone, il est dit être publié.) La partition de destination peut être avertie de l’arrivée de ce message par le biais d’une interruption. Les messages peuvent être envoyés explicitement à l’aide de l’hypercall HvCallPostMessage ou implicitement par l’hyperviseur.

Messages

Lorsqu’un message est envoyé, l’hyperviseur sélectionne une mémoire tampon de message libre. L’ensemble de mémoires tampons de message disponibles dépend de l’événement qui a déclenché l’envoi du message.

L’hyperviseur marque la mémoire tampon de message « en cours d’utilisation » et remplit l’en-tête du message avec le type de message, la taille de charge utile et les informations sur l’expéditeur. Enfin, il remplit la charge utile du message. Le contenu de la charge utile dépend de l’événement qui a déclenché le message.

L’hyperviseur ajoute ensuite la mémoire tampon de message à une file d’attente de messages de réception. La file d’attente de messages de réception dépend de l’événement qui a déclenché l’envoi du message. Pour tous les types de messages, SINTx est implicite (dans le cas des messages interceptés), explicite (dans le cas des messages du minuteur) ou spécifiée par un ID de port (dans le cas des messages invités). Le processeur virtuel cible est spécifié explicitement ou choisi par l’hyperviseur lorsque le message est mis en file d’attente. Les processeurs virtuels dont la page SynIC ou SIM est désactivée ne seront pas considérés comme des cibles potentielles. Si aucune cible n’est disponible, l’hyperviseur met fin à l’opération et retourne une erreur à l’appelant.

L’hyperviseur détermine ensuite si l’emplacement de message SINTx spécifié dans la page SIM du processeur virtuel cible est vide. Si le type de message dans l’emplacement de message est égal à HvMessageTypeNone (autrement dit, zéro), l’emplacement de message est supposé être vide. Dans ce cas, l’hyperviseur met en file d’attente la mémoire tampon du message et copie son contenu dans l’emplacement du message dans la page SIM. L’hyperviseur peut copier uniquement le nombre d’octets de charge utile associés au message. L’hyperviseur tente également de générer une interruption déclenchée par la périphérie pour le SINTx spécifié. Si l’APIC est désactivé par logiciel ou que SINTx est masqué, l’interruption est perdue. L’arrivée de cette interruption informe l’invité qu’un nouveau message est arrivé. Si la page SIM est désactivée ou si l’emplacement du message dans la page SIM n’est pas vide, le message reste mis en file d’attente et aucune interruption n’est générée.

Comme pour toute interruption de priorité fixe, l’interruption n’est pas reconnue par le processeur virtuel tant que le PPR (registre de priorité du processus) n’est pas inférieur au vecteur spécifié dans le registre SINTx et que les interruptions ne sont pas masquées par le processeur virtuel (rFLAGS[IF] est défini sur 1).

Plusieurs mémoires tampons de messages avec le même SINTx peuvent être mises en file d’attente vers un processeur virtuel. Dans ce cas, l’hyperviseur remet le premier message (autrement dit, écrivez-le dans la page SIM) et laissez les autres mis en file d’attente jusqu’à ce qu’un des trois événements se produisent :

  • Une autre mémoire tampon de message est mise en file d’attente.
  • L’invité indique la « fin de l’interruption » en écrivant dans le registre EOI de l’APIC.
  • L’invité indique la « fin du message » en écrivant dans le registre EOM de SynIC.

Dans les trois cas, l’hyperviseur analyse une ou plusieurs files d’attente de mémoire tampon de messages et tente de remettre des messages supplémentaires. L’hyperviseur tente également de générer une interruption déclenchée par la périphérie, indiquant qu’un nouveau message est arrivé.

SIM Page

La page SIM se compose d’un tableau de 16 éléments de messages de 256 octets (voir HV_MESSAGE structure de données). Chaque élément de tableau (également appelé emplacement de message) correspond à une seule source d’interruption synthétique (SINTx). Un emplacement de message est dit « vide » si le type de message du message dans l’emplacement est égal à HvMessageTypeNone.

L’adresse de la page SIM est spécifiée dans le registre SIMP. L’adresse de la page SIM doit être unique pour chaque processeur virtuel. La programmation de ces pages pour chevaucher d’autres instances des pages SIEF ou SIM ou toute autre page de superposition (par exemple, la page hypercall) entraîne un comportement non défini.

Les accès en lecture et en écriture par un processeur virtuel à la page SIM se comportent comme des accès en lecture et en écriture à la RAM. Toutefois, l’implémentation SynIC de l’hyperviseur écrit également dans les pages en réponse à certains événements.

Lors de la création et de la réinitialisation du processeur virtuel, la page SIM est effacée sur zéro.

Le mécanisme de remise des messages SynIC est conçu pour prendre en charge une remise et une réception efficaces des messages dans une partition cible. Il est recommandé que l’ISR de gestion des messages (routine de service d’interruption) dans la partition cible effectue les étapes suivantes :

  • Examinez le message qui a été déposé dans l’emplacement de message SIM.
  • Copiez le contenu du message à un autre emplacement et définissez le type de message dans l’emplacement de message sur HvMessageTypeNone.
  • Indiquez la fin de l’interruption du vecteur en écrivant dans le registre EOI de l’APIC.
  • Effectuez toutes les actions implicites par le message.

Sources de messages

Les classes d’événements qui peuvent déclencher l’envoi d’un message sont les suivantes :

  • Intercepts : toute interception dans un processeur virtuel entraîne l’envoi d’un message à la partition parente ou à une durée de vie VTL supérieure.
  • Minuteurs : les mécanismes du minuteur entraînent l’envoi de messages. Associés à chaque processeur virtuel sont quatre mémoires tampons de message de minuteur dédiées, une pour chaque minuteur. La file d’attente de messages de réception appartient à SINTx du processeur virtuel dont le minuteur a déclenché l’envoi du message.
  • Messages invités : l’hyperviseur prend en charge le passage de messages en tant que mécanisme de communication entre les invités. Les interfaces définies dans cette section permettent à un invité d’envoyer des messages à un autre invité. Les mémoires tampons de message utilisées pour les messages de cette classe sont extraites du pool de mémoires tampons de messages invités par port du destinataire.

Mémoires tampons de messages

Une mémoire tampon de message est utilisée en interne pour l’hyperviseur pour stocker un message jusqu’à ce qu’il soit remis au destinataire. L’hyperviseur gère plusieurs ensembles de mémoires tampons de message.

Mémoires tampons de messages invités

L’hyperviseur gère un ensemble de mémoires tampons de message invité pour chaque port. Ces mémoires tampons sont utilisées pour les messages envoyés explicitement d’une partition à une autre par un invité. Lorsqu’un port est créé, l’hyperviseur alloue seize (16) mémoires tampons du pool de mémoire du propriétaire du port. Ces mémoires tampons de message sont retournées au pool de mémoires lorsque le port est supprimé.

Files d’attente de mémoires tampons de messages

Pour chaque partition et chaque processeur virtuel de la partition, l’hyperviseur gère une file d’attente de mémoires tampons de messages pour chaque SINTx (source d’interruption synthétique) dans synIC du processeur virtuel. Toutes les files d’attente de messages d’un processeur virtuel sont vides lors de la création ou de la réinitialisation du processeur virtuel.

Fiabilité et séquencement des mémoires tampons de messages invités

Les messages publiés par un invité ont été mis en file d’attente pour la remise par l’hyperviseur. La livraison et la réception réelles par la partition cible dépendent de son opération correcte. Les partitions peuvent désactiver la remise de messages à des processeurs virtuels particuliers en désactivant synIC ou en désactivant le SIMP.

L’interruption d’une connexion n’affecte pas les messages non remis (mis en file d’attente). La suppression du port cible libère toujours toutes les mémoires tampons de message du port, qu’elles soient disponibles ou contiennent des messages non remis (mis en file d’attente).

Les messages arrivent dans l’ordre dans lequel ils ont été correctement publiés. Si le port de réception est associé à un processeur virtuel spécifique, les messages arrivent dans le même ordre dans lequel ils ont été publiés. Si le port de réception est associé à HV_ANY_VP, les messages ne sont pas garantis pour arriver dans un ordre particulier.

Indicateurs d’événement SynIC

Outre les messages, SynIC prend en charge un deuxième type de mécanisme de notification entre partitions appelées indicateurs d’événement. Les indicateurs d’événement peuvent être définis explicitement à l’aide de l’hypercall HvCallSignalEvent ou implicitement par l’hyperviseur.

Indicateurs d’événement et messages

Les indicateurs d’événement sont plus légers que les messages et sont donc moins élevés. En outre, les indicateurs d’événement ne nécessitent aucune allocation de mémoire tampon ou mise en file d’attente dans l’hyperviseur. Par conséquent, HvCallSignalEvent ne échouera jamais en raison de ressources insuffisantes.

Remise de l’indicateur d’événement

Lorsqu’une partition appelle HvCallSignalEvent, elle spécifie un numéro d’indicateur d’événement. L’hyperviseur répond en définissant atomiquement un peu dans la page SIEF du processeur virtuel de réception. Les processeurs virtuels dont la page SynIC ou SIEF est désactivée ne seront pas considérés comme des cibles potentielles. Si aucune cible n’est disponible, l’hyperviseur met fin à l’opération et retourne une erreur à l’appelant.

Si l’indicateur d’événement a été précédemment effacé, l’hyperviseur tente d’avertir la partition de réception que l’indicateur est maintenant défini en générant une interruption déclenchée par la périphérie. Le processeur virtuel cible, ainsi que le SINTx cible, est spécifié dans le cadre de la création d’un port. Si SINTx est masqué, HvSignalEvent retourne HV_STATUS_INVALID_SYNIC_STATE.

Comme pour toute interruption externe de priorité fixe, l’interruption n’est pas reconnue par le processeur virtuel tant que le registre de priorité du processus (PPR) n’est pas inférieur au vecteur spécifié dans le registre SINTx et que les interruptions ne sont pas masquées par le processeur virtuel (rFLAGS[IF] est défini sur 1).

SIEF Page

La page SIEF se compose d’un tableau de 16 éléments d’indicateurs d’événement de 256 octets (voir HV_SYNIC_EVENT_FLAGS). Chaque élément de tableau correspond à une seule source d’interruption synthétique (SINTx).

L’adresse de la page SIEF est spécifiée dans le registre SIEF. L’adresse de la page SIEF doit être unique pour chaque processeur virtuel. La programmation de ces pages pour chevaucher d’autres instances des pages SIEF ou SIM ou toute autre page de superposition (par exemple, la page hypercall) entraîne un comportement non défini.

Les accès en lecture et en écriture par un processeur virtuel à la page SIEF se comportent comme des accès en lecture et en écriture à la RAM. Toutefois, l’implémentation SynIC de l’hyperviseur écrit également dans les pages en réponse à certains événements.

Lors de la création et de la réinitialisation du processeur virtuel, la page SIEF est effacée sur zéro.

Il est recommandé que la routine de service d’interruption de l’indicateur d’événement (ISR) dans la partition cible effectue les étapes suivantes :

  • Examinez les indicateurs d’événement et déterminez ceux qui, le cas échéant, sont définis.
  • Effacez un ou plusieurs indicateurs d’événement à l’aide d’une opération verrouillée (atomique), telle que LOCK AND ou LOCK CMPXCHG.
  • Indiquez la fin de l’interruption du vecteur en écrivant dans le registre EOI de l’APIC.
  • Effectuez toutes les actions implicites par les indicateurs d’événement qui ont été définis.

Ports et connexions

Un message ou un événement envoyé d’un invité à un autre doit être envoyé via une connexion pré-allouée. Une connexion, à son tour, doit être associée à un port de destination.

Un port est alloué à partir du pool de mémoire du récepteur et spécifie le processeur virtuel et SINTx à cibler. Les ports d’événements ont un « numéro d’indicateur de base » et un « nombre d’indicateurs » qui permettent à l’appelant de spécifier une plage d’indicateurs d’événements valides pour ce port.

Les connexions sont allouées à partir du pool de mémoire de l’expéditeur. Lorsqu’une connexion est créée, elle doit être associée à un port valide. Cette liaison crée un canal de communication unidirectionnel simple. Si un port est ensuite supprimé, sa connexion, alors qu’elle reste, devient inutile.

Registres SynIC

Chaque processeur virtuel possède sa propre copie de ces registres, afin qu’ils puissent être programmés indépendamment.

Sur les plateformes x64, ces registres sont accessibles en tant que registres spécifiques au modèle (MSR) à l’aide des instructions RDMSR et WRMSR :

Adresse MSR Nom de l’inscription Fonction
0x40000080 SCONTROL Contrôle SynIC
0x40000081 SVERSION SynIC Version
0x40000082 SIEFP Page Indicateurs d’événement d’interruption
0x40000083 SIMP Page Message d’interruption
0x40000084 MOE Fin du message
0x40000090 SINT0 Source d’interruption 0 (hyperviseur)
0x40000091 SINT1 Source d’interruption 1
0x40000092 SINT2 Source d’interruption 2
0x40000093 SINT3 Source d’interruption 3
0x40000094 SINT4 Source d’interruption 4
0x40000095 SINT5 Source d’interruption 5
0x40000096 SINT6 Source d’interruption 6
0x40000097 SINT7 Source d’interruption 7
0x40000098 SINT8 Source d’interruption 8
0x40000099 SINT9 Source d’interruption 9
0x4000009A SINT10 Source d’interruption 10
0x4000009B SINT11 Source d’interruption 11
0x4000009C SINT12 Source d’interruption 12
0x4000009D SINT13 Source d’interruption 13
0x4000009E SINT14 Source d’interruption 14
0x4000009F SINT15 Source d’interruption 15

Sur les plateformes ARM64, ces registres sont accessibles à l’aide de HvCallGetVpRegisters et HvCallSetVpRegisters avec les noms de registre suivants :

HvRegister Name Fonction
HvRegisterScontrol Contrôle SynIC
HvRegisterSversion SynIC Version
HvRegisterSifp Page Indicateurs d’événement d’interruption
HvRegisterSipp Page Message d’interruption
HvRegisterEom Fin du message
HvRegisterSirbp Page Mémoire tampon de réponse d’interruption
HvRegisterSint0 Source d’interruption 0 (hyperviseur)
HvRegisterSint1 Source d’interruption 1
HvRegisterSint2 Source d’interruption 2
HvRegisterSint3 Source d’interruption 3
HvRegisterSint4 Source d’interruption 4
HvRegisterSint5 Source d’interruption 5
HvRegisterSint6 Source d’interruption 6
HvRegisterSint7 Source d’interruption 7
HvRegisterSint8 Source d’interruption 8
HvRegisterSint9 Source d’interruption 9
HvRegisterSint10 Source d’interruption 10
HvRegisterSint11 Source d’interruption 11
HvRegisterSint12 Source d’interruption 12
HvRegisterSint13 Source d’interruption 13
HvRegisterSint14 Source d’interruption 14
HvRegisterSint15 Source d’interruption 15

SCONTROL Register

Ce registre est utilisé pour contrôler le comportement SynIC du processeur virtuel.

Au moment de la création du processeur virtuel et lors de la réinitialisation du processeur, la valeur de ce registre de contrôle SCONTROL (Registre de contrôle SynIC) est 0x0000000000000000. Par conséquent, les notifications d’indicateur de message et d’indicateur d’événement sont désactivées.

Bits Terrain Descriptif Attributes
63:1 RsvdP La valeur doit être conservée Lecture/écriture
0 Enable Lorsqu’il est défini, ce processeur virtuel autorise la publication des notifications d’indicateur de message et d’indicateur d’événement sur son SynIC. En cas d’effacement, les notifications d’indicateur de message et d’indicateur d’événement ne peuvent pas être dirigées vers ce processeur virtuel. Lecture/écriture

SVERSION Register

Il s’agit d’un registre en lecture seule et retourne le numéro de version de SynIC. Les tentatives d’écriture dans ce registre entraînent une erreur #GP.

Bits Terrain Descriptif Attributes
63:32 RsvdP Lire
31:0 SynIC Version Numéro de version de SynIc Lire

Registre SIEFP

Au moment de la création du processeur virtuel et lors de la réinitialisation du processeur, la valeur de ce registre SIEFP (page indicateurs d’événement d’interruption synthétique) est 0x0000000000000000. Par conséquent, le SIEFP est désactivé par défaut. L’invité doit l’activer 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 SIEFP 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.

Bits Terrain Descriptif Attributes
63:12 Adresse de base Adresse de base (dans l’espace GPA) de SIEFP (12 bits bas supposés être désactivés) Lecture/écriture
11:1 RsvdP Réservé, la valeur doit être conservée Lecture/écriture
0 Enable ACTIVER SIEFP Lecture/écriture

Registre SIMP

Au moment de la création du processeur virtuel et lors de la réinitialisation du processeur, la valeur de ce registre SIMP (page de message d’interruption synthétique) est 0x0000000000000000. Par conséquent, le SIMP est désactivé par défaut. L’invité doit l’activer 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 SIMP 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.

Bits Terrain Descriptif Attributes
63:12 Adresse de base Adresse de base (dans l’espace GPA) du SIMP (12 bits bas supposé être désactivé) Lecture/écriture
11:1 RsvdP Réservé, la valeur doit être conservée Lecture/écriture
0 Enable ACTIVER SIMP Lecture/écriture

Registres SINTx

Au moment de la création du processeur virtuel, la valeur par défaut de tous les registres SINTx (source d’interruption synthétique) est 0x0000000000010000. Ainsi, toutes les sources d’interruption synthétique sont masquées par défaut. L’invité doit les supprimer en programmant un vecteur approprié et en désactivant le bit 16.

La définition du bit d’interrogation aura l’effet de démasquer une source d’interruption, sauf qu’une interruption réelle n’est pas générée.

L’indicateur AutoEOI indique qu’un EOI implicite doit être effectué par l’hyperviseur lorsqu’une interruption est remise au processeur virtuel. En outre, l’hyperviseur efface automatiquement l’indicateur correspondant dans le « registre in-service » (ISR) de l’APIC virtuel. Si l’invité active ce comportement, il ne doit pas effectuer d’EOI dans sa routine de service d’interruption. L’indicateur AutoEOI peut être activé à tout moment, même si l’invité doit effectuer un EOI explicite sur une interruption en cours d’exécution. La prise en compte du minutage rend difficile de savoir si une interruption particulière a besoin d’EOI ou non. Il est donc recommandé de ne pas modifier si SINT n’est pas masqué. De même, l’indicateur AutoEOI peut être désactivé à tout moment, bien que les mêmes préoccupations concernant les interruptions en vol s’appliquent

Les valeurs valides pour le vecteur sont comprises entre 16 et 255. La spécification d’un nombre de vecteurs non valide entraîne #GP.

Bits Terrain Descriptif Attributes
63:19 RsvdP Réservé, la valeur doit être conservée Lecture/écriture
18 Sondages Active le mode d’interrogation Lecture/écriture
17 AutoEOI Définir si un EOI implicite doit être effectué lors de la remise d’interruption Lecture/écriture
16 Masqué Définir si le SINT est masqué Lecture/écriture
15:8 RsvdP Réservé, la valeur doit être conservée Lecture/écriture
7:0 Vector Vecteur d’interruption Lecture/écriture

Registre EOM

Une écriture à la fin du registre EOM (EOM) de l’invité entraîne l’analyse de la ou des files d’attente de mémoires tampons de messages internes associées au processeur virtuel. Si une file d’attente de mémoire tampon de message contient une mémoire tampon de message mise en file d’attente, l’hyperviseur tente de remettre le message. La remise de messages réussit si la page SIM est activée et que l’emplacement de message correspondant au SINTx est vide (autrement dit, le type de message dans l’en-tête est défini sur HvMessageTypeNone). Si un message est correctement remis, sa mémoire tampon de message interne correspondante est mise en file d’attente et marquée libre. Si le SINTx correspondant n’est pas masqué, une interruption déclenchée par la périphérie est remise (autrement dit, le bit correspondant dans le runtime d’intégration est défini).

Ce registre peut être utilisé par les invités pour « interroger » les messages. Il peut également être utilisé comme moyen de vider la file d’attente de messages pour un SINTx qui a été désactivé (c’est-à-dire masqué).

Si les files d’attente de messages sont toutes vides, une écriture dans le registre EOM est une no-op.

Les lectures du registre EOM retournent toujours des zéros.

Bits Terrain Descriptif Attributes
63:0 RsvdZ Déclencheur en écriture seule Write