Partager via


MMU virtuel

L’interface de machine virtuelle exposée par chaque partition comprend une unité de gestion de mémoire (MMU). Le MMU virtuel exposé par des partitions d’hyperviseur est généralement compatible avec les MMU existants.

L’implémentation MMU virtuelle est spécifique à l’architecture. Ce document couvre les plateformes x64 et ARM64, avec des sections spécifiques à la plateforme clairement marquées.

Vue d’ensemble du MMU virtuel

Les processeurs virtuels exposent la mémoire virtuelle et un TLB virtuel (mémoire tampon de recherche de traduction), qui met en cache les traductions d’adresses virtuelles vers des adresses physiques (invité). Comme pour le TLB sur un processeur logique, le TLB virtuel est un cache non cohérent et cette non-cohérence est visible pour les invités. L’hyperviseur expose les opérations pour vider le TLB. Les invités peuvent utiliser ces opérations pour supprimer des entrées potentiellement incohérentes et rendre prévisibles les traductions d’adresses virtuelles.

Compatibilité

Le MMU virtuel exposé par l’hyperviseur est généralement compatible avec le MMU physique trouvé dans l’architecture du processeur sous-jacente.

Sur les plateformes x64

Le MMU virtuel sur les plateformes x64 est généralement compatible avec le MMU physique trouvé dans un processeur x64. Les différences observables par l’invité suivantes existent :

  • The CR3. PWT et CR3. Les bits PCD peuvent ne pas être pris en charge dans certaines implémentations d’hyperviseur. Sur ces implémentations, toute tentative effectuée par l’invité pour définir ces indicateurs par le biais d’une instruction MOV vers CR3 ou d’un commutateur de porte de tâche sera ignorée. Les tentatives de définition de ces bits par programmation via HvSetVpRegisters ou HvCallSwitchVirtualAddressSpace peuvent entraîner une erreur.
  • Les bits PWT et PCD dans une entrée de table de pages feuilles (par exemple, un PTE pour les pages 4 K et un PDE pour les pages volumineuses) spécifient la mise en cache de la page en cours de mappage. Les bits PAT, PWT et PCD dans les entrées de table de pages non feuilles indiquent la mise en cache de la table de pages suivante dans la hiérarchie. Certaines implémentations d’hyperviseur peuvent ne pas prendre en charge ces indicateurs. Sur ces implémentations, tous les accès à la table de pages effectués par l’hyperviseur sont effectués à l’aide d’attributs de cache d’écriture différée. Cela affecte, en particulier, les bits accessibles et sales écrits dans les entrées de la table de pages. Si l’invité définit les bits PAT, PWT ou PCD dans les entrées de la table de pages non feuille, un message « fonctionnalité non prise en charge » peut être généré lorsqu’un processeur virtuel accède à une page mappée par cette table de pages.
  • Le bit CR0.CD (désactivation du cache) peut ne pas être pris en charge dans certaines implémentations d’hyperviseur. Sur ces implémentations, le bit CR0.CD doit être défini sur 0. Toute tentative effectuée par l’invité pour définir cet indicateur via une instruction MOV vers CR0 sera ignorée. Les tentatives de définition de ce bit par programmation via HvSetVpRegisters entraînent une erreur.
  • Le MSR pat (type d’adresse de page) est un registre par VP. Toutefois, lorsque tous les processeurs virtuels d’une partition définissent le MSR PAT sur la même valeur, le nouvel effet devient un effet à l’échelle de la partition.
  • Pour des raisons de sécurité et d’isolation, l’instruction INVD sera virtualisée pour agir comme une instruction WBINVD, avec quelques différences. À des fins de sécurité, CLFLUSH doit être utilisé à la place.

Opérations de gestion de l’équilibrage de charge de base de données héritées

Chaque architecture fournit des mécanismes natifs pour gérer les TLB du processeur. Ces mécanismes sont virtualisés par l’hyperviseur et affectent uniquement le processeur virtuel local. Pour invalider les traductions sur d’autres processeurs virtuels, les logiciels doivent utiliser des interruptions interprocesseurs spécifiques à l’architecture ou les hypercalls de gestion de LLB améliorés décrits dans la section suivante.

Sur les plateformes x64

L’architecture x64 fournit les mécanismes de gestion TLB suivants :

  • L’instruction INVLPG invalide la traduction d’une page unique à partir de l’équilibrage de charge du processeur. Si l’adresse virtuelle spécifiée a été initialement mappée en tant que page 4 K, la traduction de cette page est supprimée de l’équilibrage de charge réseau. Si l’adresse virtuelle spécifiée a été initialement mappée en tant que « grande page » (2 Mo ou 4 Mo, selon le mode MMU), la traduction de l’intégralité de la grande page est supprimée de l’équilibrage de charge réseau. L’instruction INVLPG vide à la fois les traductions globales et non globales. Les traductions globales sont définies comme celles dont le bit « global » est défini dans l’entrée de la table de pages.
  • L’instruction MOV vers CR3 et les commutateurs de tâches qui modifient les traductions cr3 invalident les traductions pour toutes les pages non globales au sein du TLB du processeur.
  • Instruction MOV vers CR4 qui modifie le CR4. Bit PGE (global page enable), cr4. BIT PSE (extensions de taille de page) ou CR4. Le bit PAE (extensions d’adresse de page) invalide toutes les traductions (globales et non globales) dans le TLB du processeur.

Notez que toutes ces opérations d’invalidation n’affectent qu’un seul processeur. Pour invalider les traductions sur d’autres processeurs, les logiciels doivent utiliser un mécanisme « TLB shoot-down » basé sur logiciel (généralement implémenté à l’aide d’interruptions entre processus).

Sur les plateformes ARM64

L’architecture ARM64 fournit des mécanismes de gestion de LLB via les instructions TLBI (TLB Invalidate). Pour plus d’informations, reportez-vous au manuel d’architecture ARM.

Note: Les instructions de maintenance du cache set/way (telles que DC ISW, DC CSW, DC CISW) ne sont pas prises en charge dans les environnements virtualisés et sont traitées comme des opérations non ops.

Améliorations de l’équilibrage de charge réseau virtuel

Outre la prise en charge des mécanismes de gestion de TLB hérités décrits précédemment, sur les plateformes x64, l’hyperviseur prend également en charge un ensemble d’améliorations qui permettent à un invité de gérer plus efficacement l’équilibrage de charge TLB virtuel. Ces opérations améliorées peuvent être utilisées de façon interchangeable avec les opérations de gestion de LLB héritées.

L’hyperviseur prend en charge les hypercalls suivants pour invalider les TLB :

Hypercall Descriptif
HvCallFlushVirtualAddressSpace Invalide toutes les entrées TLB virtuelles qui appartiennent à un espace d’adressage spécifié.
HvCallFlushVirtualAddressSpaceEx Comme HvCallFlushVirtualAddressSpace, prend un VP partiellement alloué défini comme entrée.
HvCallFlushVirtualAddressList Invalide une partie de l’espace d’adressage spécifié.
HvCallFlushVirtualAddressListEx Comme HvCallFlushVirtualAddressList, prend un VP partiellement alloué défini comme entrée.

Sur certains systèmes (ceux disposant d’une prise en charge suffisante de la virtualisation dans le matériel), les instructions de gestion de l’équilibrage de charge sécurisée héritées peuvent être plus rapides pour l’invalidation de L’équilibrage de charge réseau (interprocesseur) locale ou distante. Les invités qui s’intéressent à des performances optimales doivent utiliser la feuille UCID 0x40000004 pour déterminer quels comportements implémenter à l’aide d’hypercalls :

  • UseHypercallForAddressSpaceSwitch : si cet indicateur est défini, l’appelant doit supposer qu’il est plus rapide d’utiliser HvCallSwitchVirtualAddressSpace pour basculer entre les espaces d’adressage. Si cet indicateur est clair, une instruction MOV vers CR3 est recommandée.
  • UseHypercallForLocalFlush : si cet indicateur est défini, l’appelant doit supposer qu’il est plus rapide d’utiliser des hypercalls (par opposition à INVLPG ou MOV vers CR3) pour vider une ou plusieurs pages de l’équilibrage de charge virtuel.
  • UseHypercallForRemoteFlushAndLocalFlushEntire : si cet indicateur est défini, l’appelant doit supposer qu’il est plus rapide d’utiliser des hypercalls (par opposition à l’utilisation d’interruptions interprocesseurs générées par l’invité) pour vider une ou plusieurs pages à partir de l’équilibrage de charge réseau virtuel.

Sur les plateformes ARM64, les invités doivent généralement utiliser des mécanismes architecturaux pour la gestion de LLB.

Vue d’ensemble du contrôle de cache de mémoire

L’hyperviseur prend en charge les paramètres de mise en cache définis par l’invité pour les pages mappées dans l’espace DVA de l’invité. Pour obtenir une description détaillée des paramètres de mise en cache disponibles et de leurs significations, reportez-vous à la documentation Intel ou AMD.

Lorsqu’un processeur virtuel accède à une page via son espace DVA, l’hyperviseur respecte les bits d’attribut de cache (PAT, PWT et PCD) dans l’entrée de table de la page invitée utilisée pour mapper la page. Ces trois bits sont utilisés comme index dans le registre PAT (type d’adresse de page) de la partition pour rechercher le paramètre final de mise en cache de la page.

Les pages accessibles directement via l’espace GPA (par exemple, lorsque la pagination est désactivée, car CR0.PG est effacée) utilisent une mise en cache définie par les MTRR. Si l’implémentation de l’hyperviseur ne prend pas en charge les MTRR virtuels, la mise en cache WB est supposée.

Mélange de types de cache entre une partition et l’hyperviseur

Les invités doivent savoir que certaines pages de son espace GPA sont accessibles par l’hyperviseur. La liste suivante, sans être exhaustive, fournit plusieurs exemples :

  • Pages qui contiennent des paramètres d’entrée ou de sortie pour les hypercalls
  • Toutes les pages de superposition, y compris la page hypercall, les pages SYNIC SIEF et SIM, et les pages statistiques
  • Pages d’assistance VP et autres pages d’interface d’hyperviseur

L’hyperviseur effectue toujours des accès aux paramètres d’hypercall et aux pages de superposition à l’aide de Write-Back attributs mis en cache :

  • Sur les plateformes x64 : type de cache WB (Write-Back) via PAT
  • Sur les plateformes ARM64 : mémoire normale avec des attributs d’écriture différée interne et externe, d’allocation de données en lecture- Write-Allocate

L’hyperviseur effectue toujours des accès aux paramètres d’hypercall et aux pages de superposition à l’aide du paramètre de mise en cache WB.