title: Architecture des hyperviseurs
text: # Architecture des hyperviseurs
  
  L'architecture d'un hyperviseur englobe l'ensemble des composants et leur organisation qui permettent la mise en place de la virtualisation d'un ou plusieurs systèmes d'exploitations ou logiciels. En effet, le rôle d'un hyperviseur, qu'il soit de type 1 (natif) ou de type 2 (invité) est de fournir pour chaque machine virtuelle un ensemble de modules et d'interfaces qui est une virtualisation d'un environnement physique réel. À travers ces modules, nous trouverons une abstraction de la mémoire physique, un système d'ordonnancement entre machine virtuelle, ainsi que d'autres périphériques physiques tels que des cartes réseaux virtuelles.
  
  La mise en place d'une infrastructure virtualisée grâce à un hyperviseur implique un ensemble de contraintes liés à l'allocation de ressources aux machines virtuelles, celle-ci pouvant être plus ou moins gourmande.
  
  ## Catégories d'hyperviseur
  
  ### Architecture native
  
  Les hyperviseurs natifs (type 1) sont directement intégrés au système d'exploitation de la machine hôte.
  
  Dans cette approche, l'hyperviseur communique directement avec le matériel sur lequel il est exécuté. Il est également en mesure d'intercepter les entrées/sorties et d'en abstraire l'exécution pour le système d'exploitation invité.
  
  Une architecture native fournit une virtualisation du matériel aux machines virtuelles. En effet, ces dernières interagissent avec des périphériques virtuels via des pilotes fournis par l'hyperviseur.
  
  ### Architecture invitée
  
  Les hyperviseurs invités (type 2) sont exécutés au sein même d'un autre système d'exploitation, de ce fait ils n'ont qu'un accès limité aux ressources de la machine hôte, il est donc possible d'exécuter plusieurs hyperviseurs de ce type sur une même machine.
  
  L'hyperviseur fourni une virtualisation du matériel au système invité. Lors d'un appel à une instruction privilégiée, l'hyperviseur vérifie sa cohérence avant de l’exécuter.
  
  ## Méthodes de virtualisation
  
  ### Virtualisation Complète
  
  Dans le cas d'une virtualisation complète, le système invité ignore se trouver dans un environnement virtualisé. L'hyperviseur fournit une virtualisation de l'architecture et des ressources nécessaires à l’exécution du système invité, impliquant qu'il n'est pas nécessaire de modifier ce dernier.
  
  Dans ce cas, les périphériques d'entrée/sortie utilisés par les machines virtuelles ne sont que des abstractions des périphériques physiques générées par l'hyperviseur. Toute interaction avec ces périphériques virtuels est redirigée directement vers les périphériques physiques. De ce fait, ce type de virtualisation offre la meilleure solution en matière de performances, d'isolation et de sécurité des machines virtuelles. De plus, cette méthode simplifie la portabilité et la migrations de machines virtuelles.
  
  Dans ce modèle, l'hyperviseur est exécuté avec un niveau de privilège 0 (ring 0). A contrario, les machines virtuelles sont exécutées avec un niveau de privilège 1 (ring 1). Ce niveau de droit permet d'assurer l'isolation des machines virtuelles en les empêchant d'exécuter directement des instructions sur le matériel, seules celles interceptées par l'hyperviseur pourront être exécutées.
  
  ### Virtualisation Partielle
  
  Dans un modèle de virtualisation partielle, le système invité doit être modifié afin de pouvoir fonctionner dans l'environnement virtuel. La machine virtuelle a donc conscience de se trouver dans un environnement $virtualisé^,.$
  
  Même si les machines virtuelles sont exécutées avec un niveau de privilège «Ring 1» (droits d'accès limités), celles-ci sont tout de même gérées par l'hyperviseur qui lui dispose du niveau de privilège «Ring 0» (droits maximum).
  
  Les machines virtuelles n'ont accès qu'à des ressources virtualisées (cartes réseaux, disques durs). Ces ressources sont fournies par l'hyperviseur, qui est chargé d'intercepter les instructions transmises par les systèmes invités, et de les rediriger vers les périphériques physiques $correspondants^,.$ Dans cette situation, on dit que les systèmes invités utilisent des «Hypercalls», des demandes de ressources à l'hyperviseur.
  
  ## Mécanismes de l'hyperviseur
  
  Dans un système de machines virtuelles, les ressources (mémoire, processeur, périphériques) sont gérées par l'hyperviseur. Chaque ressource de chaque machine virtuelle est gérée via des algorithmes d'ordonnancement et de gestion fournis par l'hyperviseur.
  
  ### Ordonnancement
  
  La répartition du temps CPU est une problématique importante pour la virtualisation. En effet, l'hyperviseur se doit d'adopter une politique d'ordonnancement précise et équitable pour ses machines virtuelles. Pour ce faire, il utilise des algorithmes d'ordonnancement visant à accorder un accès équitable aux ressources.
  
  Les algorithmes suivant sont utilisés par des solutions de virtualisation :
  
  * Temps virtuel partagé (Borrowed Virtual Time) : Algorithme d'ordonnancement équitable basé sur un temps virtuel, fournissant les ressources aux différentes machines virtuelles chacune à leur tour.
  * The Simple Earliest Deadline First : Algorithme en temps réel et préemptif. Chaque processus $Dom_{i}$ indique à l'hyperviseur le temps d'utilisation du processeur dont il a besoin sous la forme $(s_{i},p_{i},x_{i})$ (avec $s_{i}$ la taille de chaque tranche de temps de periode $p_{i}$). Ainsi l'hyperviseur fourni au processus une fraction du temps d'utilisation du processeur demandé par chaque machine $virtuelle^,.$ Cela permet une répartition plus équitable du temps processeur accordé à chaque machine puisque les machines qui en ont le plus besoin auront droit à plus de temps de calcul que les autres.
  * The Credit Scheduling algorithm : Algorithme d'ordonnancement et de répartition de charge proposé par Xen : à chaque machine virtuelle se voit assigner un poids et une casquette. Si la casquette est égale à 0, la machine virtuelle peut recevoir du temps CPU supplémentaire. Une valeur non nulle de la casquette (exprimée comme un pourcentage) détermine la limite maximum de temps CPU que peut recevoir une machine $virtuelle^,.$
  
  ### Virtualisation des ressources mémoires
  
  Dans le cadre de la virtualisation de la mémoire physique, deux espaces d'adressage sont gérées par l'architecture de l'hyperviseur :
  
  * Un espace d'adressage utilisé par l'hyperviseur, appelé «page table». Cet espace d'adressage est équivalent à celui présent sur un système d'exploitation $standard^,.$
  * Un espace d'adressage utilisé par les machines virtuelle, appelé «shadow page table». Ce dernier est fourni par l'hyperviseur, qui se charge de traduire les adresses virtuelles du système invité vers les adresses virtuelles de sa «page $table»^,.$
  
  De plus, étant dans un environnement virtualisé, l'hyperviseur fourni aux machines virtuelles un ensemble de modules virtuels équivalent à ceux qu'on trouve dans une architecture physique. On trouve notamment une MMU (Memory Management Unit) et une TLB (Translation Lookaside Buffer) virtuelles et gérée par l'hyperviseur.
  
  Déroulement d'une translation $d'adresse^,^,$ :
  
  * Lorsque le système invité effectue une demande d'accès mémoire, ce dernier utilise les adresses virtuelles de la «shadow page table»
  * La TLB virtuelle reçoit cette requête qui la transmet à la MMU virtuelle
  * S'il existe une correspondance, l'adresse trouvée est transmise à la MMU de l'hyperviseur. Sinon, une exception « Page Fault » est déclenchée et redirigée vers la MMU de l'hyperviseur pour qu'il la traite
  * La MMU de l'hyperviseur se charge de récupérer dans la «page table» l'adresse physique correspondante
  * Si l'adresse physique existe, la translation est effectuée et l'adresse trouvée est retournée à la MMU de l'hyperviseur
  * Enfin, la machine virtuelle récupère l'adresse physique correspondant à l'adresse virtuelle dans la shadow page table
  
  ### Virtualisation des périphériques et des entrées/sortie
  
  Il existe de nombreux outils permettant la gestion de périphériques entre plusieurs machines virtuelles. En effet, les interfaces réseaux virtuelles et les commutateurs permettent de créer des réseaux virtuels et d'y associer les machines virtuelles corréspondante.
  
  De plus l'hyperviseur virtualise la couche matérielle et offre à chaque machine virtuelle un ensemble de périphériques virtuels standardisés afin de garantir la portabilité entre les architectures sur lesquelles l'hyperviseur serait exécuté.
  
  ## Implémentations existantes
  
  ### Xen
  
  Xen est un hyperviseur natif très complet directement intégré au noyau linux de la machine hôte. Il offre à l'utilisateur le choix entre les 2 types de virtualisation et fournit ses propres mécanismes de gestion des ressources (ordonnanceur, gestionnaire de $mémoire)^,.$
  
  Les machines virtuelles créées sont isolées au sein d'un espace d'entrées/sorties dédié. Afin de gérer les ressources allouées aux machines virtuelles, Xen limite les accès privilégiés au matériel ainsi que les vecteurs d'interruptions. De plus, Xen virtualise la configuration matérielle pour que les machines invitées puissent consulter les ressources disponibles pour lui sans pour autant leur permettre d'accèder au reste des ressources matérielles.
  
  Chaque page de la mémoire est détenue par au plus un domaine à la fois, et grâce à l'hyperviseur, il peut intéragir avec ces pages $mémoires^,.$ De plus, l'ordonnancement des taches sous Xen s'effectue grâce à l'algorithme «The Credit Scheduling $algorithm»^,.$
  
  Il existe plusieurs versions du noyau linux intégrant Xen nativement. Néanmoins, du fait de sa complexité, son intégration à un noyau linux existant peut poser de nombreux problèmes. Dans le cas d'une intégration d'hyperviseur à un noyau existant, il sera conseillé d'opter pour une solution plus simple d'installation.
  
  ### KVM
  
  KVM (Kernel based Virtual Machine) est un hyperviseur natif de virtualisation complète. Il est très léger (environ 10 000 lignes de codes) et est installé sous la forme d'un simple module linux ce qui le rend très simple d'installation et $d'utilisation^,.$
  
  KVM fait directement appel aux mécanismes de gestion des ressources intégrés au noyau linux et considère les machines virtuelles comme de simples $processus^,.$
  
  Du fait du jeune âge du projet, KVM ne peut pas virtualiser toutes les architectures et il peut être intéressant d'opter pour un hyperviseur plus complet comme Xen.
  
  