21 votes

Comment la virtualisation diffère-t-elle de l'émulation, en termes de structure ?

Quelqu'un m'a dit qu'un programme de virtualisation comme VirtualBox ne fonctionne pas comme le ferait un émulateur dans le sens où il n'émule pas les registres et utilise ceux réels pour les données virtualisées qui sont sur le CPU. Les émulateurs doivent émuler les registres car ils sont principalement utilisés pour exécuter des logiciels qui dépendent d'un environnement étranger (par exemple, un émulateur Genesis a besoin des registres et des adresses mémoire du Motorola 68000, donc le développeur doit rendre ces ressources disponibles comme registres émulés).

Ma principale question est la suivante : comment se développe la virtualisation ? Comment pouvons-nous permettre à un système d'exploitation entier de s'exécuter en tant que processus dans une machine virtuelle, mais le faire s'exécuter de manière indépendante tout en utilisant toujours le CPU réel ? Je connais seulement l'émulation, pas la virtualisation, donc si quelqu'un pouvait m'aider, ce serait sympa !

PS : Je ne demande pas seulement quelle est la différence, mais les différences dans la manière dont ils exécutent les logiciels.

33voto

Darth Android Points 36975

Initialement, vous ne pouviez pas laisser le système d'exploitation invité utiliser du matériel réel car vous n'aviez aucun moyen de le contrôler. Si vous essayiez de l'exécuter sur le CPU réel, vous n'aviez aucune garantie qu'il rendrait le contrôle à l'hôte OS.

La virtualisation, telle que vous la décrivez, est implémentée dans le matériel en permettant l'application de certaines règles et restrictions au niveau matériel, qui peuvent être gérées par l'hôte OS. Cela permet à l'hôte OS de définir des règles sur ce que l'invité peut ou ne peut pas faire, et ensuite d'exécuter réellement l'invité sur du matériel réel. Si l'invité tente de faire quelque chose avec le matériel réel qui viole les règles (comme tenter d'accéder à un dispositif de disque), le matériel suspendra l'invité et enverra une interruption à l'hôte, ce qui permettra à l'hôte de fournir une réponse (comme le retour de données provenant d'un dispositif de disque émulé), puis de reprendre l'invité.

Voici un exemple simplifié du processus :

Hôte OS : Hé CPU, j'ai besoin que tu exécutes ce code de manière virtualisée. Appelle-moi s'il veut faire quelque chose qui n'est pas juste exécuter des instructions.

Hôte CPU : C'est bon !
L'hôte CPU sauvegarde tous les registres et l'état hôte, puis commence à exécuter le code de l'OS invité

OS invité : Je suis vivant ! Hé CPU, peux-tu me chercher ce fichier ?

Hôte CPU : Euh... bien sûr. Un instant.
L'hôte CPU sauvegarde tous les registres et l'état de l'invité, puis restaure tous les registres et l'état hôte
Hôte CPU : Hé Hôte OS, l'invité voulait ce fichier !

Hôte OS : Ah, donne-leur ça : Fichier du disque dur virtuel

Hôte CPU : C'est bon !
L'hôte CPU sauvegarde tous les registres et l'état hôte, restaure les registres et l'état de l'invité, puis commence à exécuter le code de l'OS invité
Hôte CPU : Voilà ce fichier !

OS invité : Génial, merci !

La différence clé ici est qu'avec un émulateur, l'OS invité ne s'exécute jamais réellement sur le matériel. Avec la virtualisation, l'hôte OS configure des limitations dans le CPU, et exécute ensuite réellement le code de l'invité sur le CPU physique. L'exemple ci-dessus est extrêmement simplifié, mais la mémoire, l'entrée/sortie disque, voire même le réseau peuvent être contrôlés sur les derniers processeurs d'aujourd'hui, ce qui leur permet d'être interfacés en toute sécurité sans avoir à déranger l'hôte OS à chaque fois. Tant que l'invité ne tente pas de sortir des limites virtualisées, alors l'Hôte OS peut ne pas avoir de code en cours d'exécution s'il n'a rien à faire à un moment donné.


Pour ajouter un peu de perspective, cela n'est qu'une étape de plus dans une longue histoire de virtualisation et de contrôle. (Pas de garantie que cela soit dans le bon ordre ou exhaustif, mais cela devrait donner un bon aperçu de départ)

Initialement, il n'y avait pas de virtualisation. Les processus partageaient tous le même espace mémoire, avaient tous un accès complet au matériel, et la capacité de multitâche dépendait entièrement d'un processus s'arrêtant de lui-même et passant le contrôle au processus suivant. Si l'OS voulait avoir un quelconque contrôle sur un processus, il devait exécuter le processus dans un émulateur (personne ne le faisait, car c'était bien trop lent).

En premier est venu la Mémoire Privée : certaines actions qui ne peuvent être effectuées que par des régions spéciales de la mémoire. Ces régions sont occupées par l'OS, lui permettant d'agir comme une passerelle vers ces actions privilégiées. Un exemple est la capacité de lire/écrire des données à un matériel. Cela empêche les processus de lire/écrire directement sur le disque dur, et les force à demander à l'OS de lire/écrire pour eux. Cela permet à l'OS de vérifier si le processus a la permission avant d'effectuer l'action.

Ensuite est venu "l'émulation" du "temps", pour ainsi dire. L'OS pouvait configurer le CPU pour interrompre le processus actif à des intervalles définis, lui permettant de prendre le contrôle de la planification et de passer d'un processus à l'autre. L'OS pouvait désormais exécuter des processus directement sur le matériel et toujours les empêcher de mal utiliser le temps CPU. Cela était assuré par un minuteur matériel.

Ensuite est venu la mémoire virtuelle : Le problème avec la mémoire partagée est que n'importe quel processus pouvait lire la mémoire d'un autre processus. Que se passe-t-il lorsque le programme de Marie lit le mot de passe de Bob depuis son navigateur web ? La mémoire virtuelle permet à l'OS de mapper la mémoire qu'un processus voit à différentes parties de la mémoire physique, voire même de les déplacer hors de la mémoire physique entièrement (vers le fichier de page). Chaque fois qu'un processus tente de lire ou d'écrire dans la mémoire, l'UMVM (unité de gestion de mémoire virtuelle) du CPU recherche où elle est map...

D'accord, à ce stade, nous en sommes à peu près aux débuts du processeur X86, où nous pouvons exécuter des processus en toute sécurité et les empêcher activement de prendre le contrôle du système à moins que l'OS ne les y autorise spécifiquement. À ce stade, les processus sont effectivement "virtualisés". Ce support existe depuis longtemps, donc on n'entend pas vraiment les gens parler de processus virtualisés, car on suppose que tous les processus sont maintenant virtualisés.

Mais pourquoi les OS virtualisés sont-ils spéciaux ? Pourquoi ne pouvons-nous pas simplement en démarrer un en tant que processus et le laisser faire son truc ? Eh bien, le problème est que, en tant qu'OS, le système invité s'attend à pouvoir accéder et utiliser les mêmes contrôles que l'hôte utilise pour contrôler les processus - en gros, l'OS s'attend à être le souverain suprême de l'ordinateur, et ils ne fonctionnent tout simplement pas si ce n'est pas le cas. Les extensions de "Virtualisation Matérielle" (AMD-V pour AMD, et VT-x pour Intel) permettent à l'hôte OS de fournir un ensemble virtualisé de contrôles de processus virtuels (mémoire privilégiée virtuelle, minuteurs matériels virtuels, mémoire virtuelle virtuelle).

1voto

LawrenceC Points 70381

Comment permettons-nous à un système d'exploitation entier de s'exécuter en tant que processus dans une machine virtuelle, tout en le faisant fonctionner de manière indépendante tout en continuant à utiliser le CPU réel?

(Ce qui suit est beaucoup simplifié.)

En exploitant le même mécanisme ou un mécanisme similaire que le système d'exploitation utilise pour maintenir les processus en mode utilisateur en ligne, principalement.

Les processus en mode utilisateur provoqueront des exceptions de CPU lorsqu'ils tentent de faire quelque chose qui ne leur est pas autorisé.

Donc, si nous avons un noyau de système d'exploitation qui s'exécute en mode utilisateur, à chaque fois qu'il tente de faire quelque chose comme accéder directement au matériel, cela provoquera une exception. Un hyperviseur peut détecter cette exception et répondre avec un comportement émulé ou virtualisé, au lieu de provoquer un crash système comme le ferait un noyau normal.

Il peut effectuer l'accès au matériel au nom de ce noyau, effectuer un accès au matériel modifié (c'est-à-dire accéder à une partie d'un fichier au lieu d'un accès direct à un secteur de disque), ou tout ce que vous pourriez imaginer.

Les extensions de machine virtuelle de CPU étendent essentiellement tout le mode "superviseur" ou "protégé" du CPU d'un niveau supplémentaire pour faire exactement cela, et fournissent également un "niveau de virtualisation" supplémentaire de la mémoire virtuelle pour faciliter la virtualisation du pagination.

0voto

Keltari Points 67159

La virtualisation consiste à simuler des parties du matériel d'un ordinateur - assez pour qu'un système d'exploitation invité puisse s'exécuter sans modification - mais la plupart des opérations se produisent toujours sur le matériel réel pour des raisons d'efficacité. La virtualisation est donc normalement plus rapide que l'émulation, mais le système réel doit avoir une architecture identique à celle du système invité. Par exemple, VMWare peut fournir un environnement virtuel pour exécuter une machine virtuelle Windows XP "à l'intérieur" d'un véritable ordinateur. Cependant, VMWare ne peut pas fonctionner sur un véritable matériel autre qu'un véritable PC x86.

Dans l'émulation, la machine virtuelle simule le matériel complet en logiciel. Cela permet à un système d'exploitation pour une architecture informatique de s'exécuter sur l'architecture pour laquelle l'émulateur est écrit. Comme toutes les opérations sont exécutées en logiciel, l'émulation a tendance à être plus lente, mais elle peut supporter plus de plateformes car elle est indépendante du matériel.

0voto

Daniel R Hicks Points 6107

Juste pour être complet, il y a aussi simulation, où les actions de la machine sont dupliquées, mais en utilisant un code dont les internes peuvent être radicalement différents de la machine "réelle". (Pensez à un "simulateur de vol".) Souvent, les simulateurs compileront le code source de la machine "réelle" mais cibleront une architecture CPU totalement différente, avec des systèmes d'exploitation et des facilities I/O totalement différents.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X