Comprendre la virtualisation du matériel et le rôle critique des registres du CPU

La virtualisation a transformé l'informatique moderne, permettant aux fournisseurs de cloud, aux entreprises et aux centres de données de maximiser l'utilisation du matériel en exécutant plusieurs systèmes d'exploitation et applications sur un seul serveur physique. Au cœur de cette technologie se trouve l'hyperviseur, couche logicielle qui gère les machines virtuelles (VMs). Cependant, la capacité de l'hyperviseur à contrôler efficacement l'exécution de VM, à isoler les environnements invités et à basculer entre eux dépend fortement d'une composante fondamentale du CPU : les registres. Ces petits sites de stockage ultrarapides ne sont pas simplement des détenteurs passifs de données; ils sont des agents actifs d'isolement, de contexte et de contrôle.

Que sont les registres du CPU? Les blocs de construction de l'État du processeur

Les registres sont les emplacements de mémoire les plus rapides à l'intérieur d'un processeur. Ils résident directement sur la matrice du processeur et peuvent être lus ou écrits dans un cycle d'horloge unique — des ordres de grandeur plus rapides que la mémoire cache ou la RAM. Généralement mesurés en bits (32 bits, 64 bits), les registres stockent des données critiques telles que l'adresse suivante de l'instruction (compteur de programme ou pointeur d'instruction), le pointeur de la pile, les résultats arithmétiques et les drapeaux de contrôle.

Classement des registres

  • Registres à usage général (GPRs): Utilisé pour les opérations arithmétiques, logiques et le mouvement des données. Dans les architectures x86-64, des registres comme RAX, RBX, RCX, RDX, RSI, RDI, R8–R15 sont disponibles.
  • Registres à usage spécial : Inclure le pointeur d'instruction (RIP dans x86-64), le pointeur de cheminée (RSP) et le registre des drapeaux (RFLAGS).
  • Registres de contrôle: Dans x86, enregistre CR0, CR2, CR3, CR4 et CR8 fonctions de système de contrôle comme les extensions de pagination, de protection et de virtualisation.
  • Les registres de segment[: CS, DS, ES, FS, GS, SS gèrent la segmentation de la mémoire – bien qu'ils demeurent maintenant largement vestigieux en mode 64 bits, ils demeurent importants pour la compatibilité héritée et certains scénarios de VM.
  • Registres spécifiques aux modèles (MSR): Registres spécifiques aux processeurs qui contrôlent des caractéristiques telles que les compteurs de performance, les extensions de température et de virtualisation. Ils ne font pas partie de l'ensemble standard de registre et doivent être accessibles via les instructions RDMSR/WRMSR.
  • Registres de débogage: DR0–DR7 utilisé pour les points d'arrêt et le débogage du matériel.

Chaque VM fonctionnant sur un hyperviseur a besoin de sa propre copie de ces registres pour maintenir un contexte d'exécution indépendant. Lorsque l'hyperviseur passe d'un VM à un autre, il sauve l'état de registre de la VM sortante et restaure l'état de la VM entrante. Ce commutateur de contexte doit être extrêmement rapide pour éviter des performances importantes en tête.

Le rôle central des registres dans la virtualisation

L'hyperviseur (souvent appelé Virtual Machine Monitor, VMM) agit comme arbitre des ressources matérielles. Les registres sont le mécanisme principal par lequel la VMM maintient l'état par-VM, impose l'isolement et intercepte les opérations privilégiées. Voici les moyens clés pour les registres permettant la virtualisation:

Contexte Préservation et commutation

Chaque VM reçoit un ensemble de registres virtualisés. Lorsque l'hyperviseur effectue un commutateur de contexte (par exemple, le temps partagé entre deux VM), il enregistre les valeurs de registre actuelles dans une structure de mémoire appelée bloc de contrôle de machine virtuelle (VMCB en AMD) ou structure de contrôle de machine virtuelle (VMCS en Intel). Il charge ensuite l'état de registre enregistré de la VM suivante. Ce processus implique des dizaines de registres et doit être optimisé.

Virtualisation au niveau de l'enseignement

Les systèmes d'exploitation invités s'attendent à exécuter des instructions privilégiées (par exemple, changer de table de page, mettre à jour les descripteurs d'interruption). Dans la virtualisation classique du piège et de l'émulation, lorsque le client tente de modifier un registre privilégié, le CPU soulève un piège, et l'hyperviseur intercepte les instructions, émule son effet sur le registre virtuel, et retourne le contrôle au client. Cela garantit que le client ne peut pas modifier l'état matériel réel.

Isolation par la protection des registres

Si un OS invité peut modifier CR3, il peut cartographier la mémoire physique appartenant à un autre VM. L'hyperviseur l'empêche en définissant une table de page d'ombre ou en utilisant des tables de page imbriquées (EPT/NPT) où l'hyperviseur contrôle la traduction d'adresse de deuxième niveau. Le contrôle d'accès au niveau de l'enregistrement garantit que même si un invité essaie d'écrire à CR3, l'hyperviseur est en charge.

Traitement des registres spécifiques aux modèles (RSM)

Les fonctions de contrôle des MSRs comme les extensions de débogue, la surveillance des performances et la gestion de la puissance. De nombreux MSR sont par cœur et affectent l'ensemble du processeur physique. La virtualisation est difficile car ils ne sont pas automatiquement sauvegardés/restaurés lors des commutateurs de contexte VM. L'hyperviseur doit utiliser une combinaison d'accès de piégeage (via les bitmaps MSR) et émuler les lectures/écritures de MSR pour présenter chaque VM avec son propre espace virtuel MSR. Un VM voyous ne doit pas être en mesure de lire les valeurs MSR d'un autre VM (comme les registres de stockage de traces de branche ou de vérification de machine).

Types de registres utilisés spécifiquement dans la virtualisation

Registres généraux des activités

Les GPR sont les registres les plus fréquemment consultés. Chaque VM obtient son propre ensemble de valeurs pour RAX via R15. Lors de la commutation de contexte, tous les GPR sont enregistrés et restaurés. Les hyperviseurs critiques de performance peuvent utiliser des fonctionnalités CPU comme la segmentation de mémoire (FS, GS) pour stocker des pointeurs par MV pour éviter la pollution du cache.

Registres de contrôle (CR0, CR2, CR3, CR4, CR8)

  • CR0: Contrôle les modes de fonctionnement du processeur (PE bit pour le mode protégé, PG bit pour la recherche).Les tentatives de modification de PE ou PG doivent être interceptées.
  • CR2: Contient l'adresse linéaire de la dernière page de défaut. Les hyperviseurs s'en remettent pour implémenter la demande de recherche et gérer les défauts de page imbriqués.
  • CR3: Tient l'adresse de base de la hiérarchie de la table de page. La virtualisation assistée par le matériel utilise des tables de page élargies (EPT) dans les tables de page item ou imbriquées (NPT) dans AMD, de sorte que le CR3 de l'invité pointe vers les pages physiques invités, et les tables de deuxième niveau de l'hyperviseur mapent les tables de l'invité-physique à la machine-physique.
  • CR4: Active des fonctionnalités comme l'extension d'adresse physique (PAE), le SMEP, le SMAP et les extensions de virtualisation (VMXE bit).
  • CR8: Registre des priorités de tâches, utilisé pour interrompre la gestion. L'hyperviseur virtualise ceci pour contrôler l'interruption de la livraison aux VM.

Registres de segments

Bien que la segmentation soit largement inutilisée en mode 64 bits, les registres de segment (CS, DS, SS, ES, FS, GS) contiennent toujours des caches descripteurs cachés qui stockent la base, les limites et les attributs. Dans la virtualisation, l'hyperviseur doit virtualiser ces valeurs mises en cache parce qu'elles affectent les permissions d'accès à la mémoire.

Registres spécifiques aux modèles (RMS) dans la virtualisation

De nombreux MSR sont pertinents pour la virtualisation. Par exemple : IA32 VMX BASIC et IA32 VMX MISC[ décrivent les capacités du processeur pour Intel VMX. - SYSENTER CS, SYSENTER EIP, SYSENTER ESP[ contrôlent les appels rapides du système, souvent interceptés par l'hyperviseur. - IA32 EFER permet des fonctionnalités comme SYSCALL/SYSRET et NX bit. - L'hyperviseur doit émuler soigneusement les MSR qui affectent le comportement du système, en particulier pour la gestion de l'alimentation (par exemple, la base de l'APIC MSR).

Registres de débogage (DR0–DR7)

Les registres de débogage sont par cœur et peuvent être définis par l'OS invité pour le débogage. L'hyperviseur doit les enregistrer et les restaurer sur les commutateurs de contexte. De plus, les logiciels malveillants pourraient utiliser des registres de débogage pour sortir de la VM si pas correctement virtualisé.

Extensions de virtualisation matérielle : Comment les registres sont améliorés

Avant les extensions matérielles, la virtualisation des logiciels purs (traduction binaire) a subi des sanctions de performance importantes. Intel a introduit VT-x (Virtualization Technology) et AMD a introduit AMD-V (Pacifica) pour ajouter de nouveaux modes CPU et des structures de registres dédiées qui rationalisent la virtualisation.

Intel VT-x: VMCS et champs d'état hôte/invité

La structure de contrôle virtuel de la machine (VMCS) est une structure de données qui contient tous les états de registre pour un VM. Elle comprend : - la zone d'état invité : copies de CR0, CR3, CR4, RSP, RIP, RFLAGS, registres de segment, etc. - la zone d'état hôte : enregistre l'état de registre de l'hyperviseur à restaurer sur les sorties VM. - les champs de contrôle : spécifiez les événements qui provoquent les sorties VM (par exemple, certains accès MSR, charges CR3). - les champs d'information de sortie : enregistrez la cause d'une sortie VM (par exemple, qui a été modifiée).

Le VMCS est chargé dans le processeur via l'instruction VMPTRLD, et la commutation de contexte entre VMs est rapide parce que le processeur enregistre/restore tous les états invités en une seule opération. L'instruction VMXON active le mode virtualisation; le mode racine VMX (hyperviseur) et le mode non-root (invité) ont chacun leurs propres niveaux de privilège.

AMD-V: VMCB

AMD utilise le bloc de contrôle virtuel de la machine (VMCB), stocké en mémoire physique. L'instruction VMRUN charge le VMCB et passe en mode invité. Comme VMCS, VMCB contient l'état du registre invité et hôte et les commandes pour l'interception des événements. AMD utilise également les tables de pages nentées (NPT) qui se basent sur un ensemble séparé de registres de table de pages contrôlés par l'hyperviseur.

Extensions de virtualisation ARMv8

Les processeurs ARM ont leurs propres extensions de virtualisation (VHE) qui fournissent EL2 (niveau de privilège hyperviseur). Les enregistrements comme le comportement de virtualisation de contrôle HCR EL2 et le VTTBR EL2 détient l'adresse de base pour la table de traduction de deuxième étape. ARM n'exige pas une structure similaire à VMCS mais s'appuie sur les banques de registre qui sont commutées sur le commutateur de contexte en utilisant les registres VMPIDR, VPIDR et HCR.

Considérations relatives au rendement dans la gestion des registres

Le coût d'économie et de restauration des registres pendant les transitions VM est un facteur de performance critique. Chaque sortie et entrée VM implique des dizaines de chargements et de stockages de registres. La virtualisation assistée par le matériel réduit ce coût car le processeur effectue lui-même des sauvegardes/restaurations en vrac en utilisant le microcode, mais les sorties sont toujours coûteuses (cents cycles).

Minimiser les sorties VM

L'hyperviseur peut configurer le VMCS/VMCB pour empêcher les sorties fréquentes. Par exemple, de nombreux accès MSR peuvent être gérés sans sortie VM si l'hyperviseur pré-peuple les bitmaps MSR pour permettre l'accès direct aux clients (pour les MSR bénins comme le compteur de temps).

Enregistrez le cache et l'ombre

Certains hyperviseurs cachent des valeurs de registre invité dans la structure de données VCPU pour éviter les charges redondantes. Par exemple, le client CR3 est souvent hombre : l'hyperviseur garde une copie et ne met à jour le réel CR3 que lorsque le client change ses tables de page. De même, les valeurs MSR du client peuvent être mises en cache et synthétisées paresseux.

Impact de la virtualisation en nid

Lorsqu'un hyperviseur s'exécute à l'intérieur d'un VM (virtualisation par neutralisation), l'hyperviseur externe doit virtualiser les structures du VMCS/VMCB eux-mêmes. Cela nécessite des soins supplémentaires avec les registres – par exemple, l'instruction VMLAUNCH doit être interceptée et émulée par l'hyperviseur externe, ce qui entraîne des sauvegardes/restaurations supplémentaires du registre.

Incidences sur la sécurité de la virtualisation des registres

Un hyperviseur compromis pourrait fuir les valeurs de registre entre VMs si la commutation de contexte n'est pas approfondie. Par exemple, lors d'un changement de contexte, les données de résidus dans les registres qui ne sont pas écrasés pourraient être observées par la VM suivante. Les hyperviseurs doivent zéror les registres sensibles (comme les registres de débogage et les MSR qui détiennent des clés secrètes) avant de charger la nouvelle VM.

Vulnérabilités d'exécution spéculative

Les attaques de Meltdown et Spectre exploitent le fait que l'exécution spéculative peut accéder à des valeurs de registre qui ne sont pas architecturalement visibles. Dans la virtualisation, l'état de registre de l'hyperviseur peut être divulgué à un invité malveillant par des canaux côté microarchitecturaux.

Registres et sécurité immuables

Certains MSR (comme ceux qui contrôlent l'authentification de débogage ou les numéros de série du processeur) ne devraient jamais être accessibles par les invités. L'hyperviseur définit les bitmaps MSR pour provoquer une sortie VM sur n'importe quel accès, puis retourne une erreur ou une valeur fausse.

Défis et orientations futures

Bien que les processeurs modernes offrent un support de virtualisation des registres riche, des défis subsistent.Un problème majeur est le nombre croissant de MSRs que les processeurs ajoutent des fonctionnalités – chaque nouveau MSR peut devoir être virtualisé, ce qui peut conduire à des structures VMCS/VMCB plus grandes et des commutateurs de contexte plus lents.Un autre défi est informatique hétérogénieuse[: les cœurs des processeurs dans une configuration grand.LITTLE peut avoir différentes capacités de registre.

Le matériel futur peut comprendre des registres matériels dédiés à la virtualisation, comme un « fichier de registre de virtualisation » par cœur qui se met automatiquement en marche sur l'entrée/sortie de VM sans enregistrer/restaurer explicitement. De plus, les technologies de calcul confidentiel[ comme Intel TDX et AMD SEV dépendent du chiffrement et de l'intégrité de la mémoire, mais l'état de l'enregistrement à l'intérieur du processeur doit être protégé de l'hyperviseur.

Conclusion

Les registres CPU sont les héros méconnus de la virtualisation matérielle. Ils stockent l'état critique de chaque machine virtuelle, imposent l'isolement par un accès contrôlé et permettent à l'hyperviseur de basculer entre les VM avec un minimum de frais généraux. Des registres à usage général aux registres de contrôle et aux MSR, chaque type joue un rôle spécifique dans le maintien de l'illusion de matériel dédié pour chaque invité. Les extensions de virtualisation matérielle comme les VT-x et AMD-V ont rendu la gestion des registres plus efficace en introduisant des structures dédiées telles que VMCS et VMCB, ainsi que des tables de pages imbriquées qui déchargent la traduction de mémoire au CPU. Des optimisations de performance comme les sorties paresseuses de sauvegarde/restauration et les sorties contrôlées par bitmap réduisent encore les frais généraux.