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


20

Quelqu'un m'a dit qu'un programme de virtualisation comme VirtualBox ne fonctionne pas comme le fait un émulateur dans le sens où il n'émule pas de registres et utilise les réels pour les données virtualisées qui se trouvent sur le CPU. Les émulateurs doivent émuler les registres car ils sont principalement destinés à exécuter un logiciel qui dépend 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 sous forme de registres émulés).

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

PS: Je ne demande pas seulement quelle est la différence, mais des différences dans la façon dont ils gèrent les logiciels.

Réponses:


32

À l'origine, vous ne pouviez pas laisser le système d'exploitation invité utiliser du vrai matériel car vous n'aviez aucun moyen de le contrôler. Si vous tentiez de l'exécuter sur le vrai CPU, vous n'aviez aucune garantie qu'il rendrait le contrôle au système d'exploitation hôte.

La virtualisation telle que vous la décrivez est implémentée dans le matériel en permettant à certaines règles et restrictions d'être appliquées au niveau du matériel, qui peut être géré par le système d'exploitation hôte. Cela permet au système d'exploitation hôte de définir des règles sur ce que l'invité peut et ne peut pas faire, puis d'exécuter réellement l'invité sur du matériel réel. Si l'invité essaie de faire quelque chose avec le vrai matériel qui viole les règles (comme essayer d'accéder à un périphérique de disque), le matériel suspendra l'invité et enverra à l'hôte une interruption, ce qui permet à l'hôte de fournir une réponse (telle que renvoyant des données à partir d'un périphérique de disque émulé), puis reprenez l'invité.

Voici un exemple simplifié du processus:

OS hôte: Hé CPU, j'ai besoin que vous exécutiez ce code virtualisé. Appelez-moi si elle veut faire quelque chose qui ne consiste pas seulement à exécuter des instructions.

CPU hôte: vous l'avez!
Le processeur hôte enregistre tous les registres et états d'hôte, puis commence à exécuter le code du système d'exploitation invité

OS invité: je suis vivant! Hé CPU, pouvez-vous me procurer ce fichier?

CPU hôte: Euh ... bien sûr. Un moment.
Le CPU hôte enregistre tous les registres et états d'invité, puis restaure tous les registres et l'état d'
hôte CPU hôte: Hey Host OS, l'invité voulait ce fichier!

OS hôte: Oh, donnez-leur ceci: fichier depuis le disque dur virtuel

CPU hôte: vous l'avez!
Le CPU hôte enregistre tous les registres et l'état des hôtes, restaure les registres et l'état des invités, puis commence à exécuter le code OS invité
CPU hôte: voici ce fichier!

OS invité: doux, merci!

La principale différence est ici dans un émulateur, le système d'exploitation invité ne s'exécute jamais réellement sur le matériel. Avec la virtualisation, le système d'exploitation hôte configure les limitations dans le processeur, puis exécute réellement le code invité sur le processeur physique. L'exemple ci-dessus est extrêmement simplifié, mais la mémoire, les E / S disque et même la mise en réseau peuvent être contrôlées sur les derniers processeurs d'aujourd'hui, ce qui leur permet d'être interfacés en toute sécurité sans avoir à déranger le système d'exploitation hôte à chaque fois. Tant que l'invité n'essaie pas d'aller en dehors des limites virtualisées, le système d'exploitation hôte 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, ce n'est qu'une étape de plus dans une longue histoire de virtualisation et de contrôle. (Aucune garantie que cela est dans le bon ordre ou exhaustif, mais devrait donner un bon aperçu de départ)

À l'origine, il n'y avait pas de virtualisation. Les processus partageaient tous le même espace mémoire, tous avaient un accès complet au matériel, et la capacité d'effectuer plusieurs tâches dépendait entièrement de l'arrêt d'un processus et de la maîtrise du processus suivant. Si le système d'exploitation voulait avoir une sorte de contrôle sur un processus, il devait exécuter le processus dans un émulateur (personne ne l'a fait, car c'était trop douloureusement lent).

La première était la mémoire privilégié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, ce qui lui permet d'agir comme une passerelle vers ces actions privilégiées. Un exemple est la possibilité de lire / écrire des données sur le matériel. Cela empêche les processus de lire / écrire directement sur le disque dur et les oblige à la place à demander au système d'exploitation de lire / écrire pour eux. Cela signifie que le système d'exploitation peut vérifier si le processus est autorisé avant d'effectuer l'action.

Vint ensuite le «temps» virtualisé pour ainsi dire. Le système d'exploitation pourrait configurer la CPU pour interrompre le processus actif à des intervalles définis, lui permettant de prendre le contrôle de la planification et de basculer entre les processus. Le système d'exploitation pouvait désormais exécuter des processus directement sur le matériel et toujours les empêcher d'utiliser à mauvais escient le temps processeur. Cela a été fourni par une minuterie matérielle .

Vient ensuite la mémoire virtualisée : le problème avec la mémoire partagée est que tout processus peut lire la mémoire de tout autre processus. Que se passe-t-il lorsque le programme de Mary lit le mot de passe de Bob depuis son navigateur Web? La mémoire virtuelle permet au système d'exploitation de mapper la mémoire qu'un processus voit sur différentes parties de la mémoire physique, ou même de les déplacer complètement de la mémoire physique (vers le fichier d'échange). Chaque fois qu'un processus essaie de lire ou d'écrire dans la mémoire, la VMMU (unité de gestion de mémoire virtuelle) du CPU recherche où il est mappé dans la mémoire physique et y exécute l'action. S'il est mappé hors de la mémoire, le processeur appelle le système d'exploitation pour récupérer la page en mémoire à partir du fichier de page.

Très bien, donc à ce stade, nous avons atteint les 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, sauf si le système d'exploitation le permet spécifiquement. À ce stade, les processus sont effectivement «virtualisés». Ce support existe depuis longtemps , donc vous n'entendez pas vraiment les gens parler de processus virtualisés, car on suppose simplement que tous les processus sont virtualisés maintenant.

Mais pourquoi les OS virtualisés sont-ils spéciaux? Pourquoi ne pouvons-nous pas simplement en lancer un en tant que processus et le laisser faire sa propre chose? Eh bien, le problème est qu'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 - fondamentalement, l'OS s'attend à être la règle suprême de l'ordinateur, et ils ne font tout simplement pas '' t fonctionne si ce n'est pas le cas. Les extensions de «virtualisation matérielle» (AMD-V pour AMD et VT-x pour Intel) permettent au système d'exploitation hôte de fournir un ensemble virtualisé de contrôles de processus virtuels (mémoire virtuelle privilégiée, temporisations matérielles virtuelles, mémoire virtuelle virtuelle).


Ça me rappelle une pièce en un acte de l'IRC que j'ai vue une fois (éventuellement NSFW: contient du langage PG-13)
Scott Chamberlain

Mon ordinateur n'a pas de virtualisation matérielle (AMD-V ni VT-x). Mais je suis capable d'exécuter une machine virtuelle sur VirtualBox ... VirtualBox installe un pilote sur le système d'exploitation pour pouvoir le faire. Comment cela se fait-il?
NothingsImpossible

1
@NothingsImpossible: à moins que vous n'ayez une très vieille machine, la plupart des CPU traditionnels vendus aujourd'hui prennent en charge la virtualisation matérielle. La virtualisation de base est toujours possible car le CPU enverra une interruption au superviseur (noyau) si un programme (comme un OS invité) essaie d'exécuter des instructions qui ne sont pas autorisées dans le niveau de sécurité actuel. Tout ce que l'OS hôte a à faire est d'intercepter ces interruptions, de déterminer l'opération souhaitée et de reprendre l'exécution du processus enfant. AMD-V / VT-x ne permet qu'une virtualisation plus efficace, car le CPU lui-même peut désormais exécuter les instructions "interdites".
Lie Ryan

@LieRyan Merci pour l'explication. Mais ce n'est pas vieux, c'est un processeur Atom. Celui-ci, pour être précis: ark.intel.com/products/70105
NothingsImpossible

1

Comment pouvons-nous permettre à tout un système d'exploitation de s'exécuter en tant que processus dans une machine virtuelle, mais de le faire fonctionner de manière indépendante tout en utilisant le processeur réel?

(Ce qui suit est beaucoup simplifié.)

En tirant parti du mécanisme identique ou similaire que le système d'exploitation utilise pour maintenir les processus en mode utilisateur en ligne, principalement.

Les processus en mode utilisateur provoquent des exceptions de processeur lorsqu'ils tentent de faire quelque chose qu'ils ne sont pas autorisés à faire.

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

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

Les extensions de machine virtuelle du processeur étendent essentiellement le mode "superviseur" ou "protégé" du processeur sur un niveau supplémentaire pour faire exactement cela, et fournissent également un "niveau d'imbrication" supplémentaire de mémoire virtuelle afin que la pagination soit plus facile à virtualiser.


0

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

En émulation, la machine virtuelle simule le matériel complet du logiciel. Cela permet à un système d'exploitation pour une architecture d'ordinateur d'être exécuté sur l'architecture pour laquelle l'émulateur est écrit. Étant donné que toutes les opérations sont exécutées dans le logiciel, l'émulation a tendance à être plus lente, mais peut prendre en charge plus de plates-formes car elle est indépendante du matériel.


Ok ... mais comment voulez-vous dire "simuler" des parties du matériel? Un émulateur fait exactement la chose ... comment la virtualisation permet-elle au système d'exploitation invité de tirer parti des ressources réelles du processeur?
tonnes de bons

@tonsbons: Par définition. : P Un émulateur ne fait pas exactement la même chose - il émule tout à partir du CPU. Bochs, par exemple, est un émulateur. La virtualisation est plus mince; un hyperviseur exécute le système d'exploitation invité sur le processeur physique (incitant essentiellement l'invité à penser qu'il possède le processeur). Puisque l'invité n'a pas les privilèges qu'il pense avoir, cependant, il déclenche des "défauts" lorsqu'il essaie de faire des trucs kernelly. L'hyperviseur surveille ces défauts et fait tourner le matériel virtuel pour qu'il ressemble à l'invité comme si ces opérations avaient réellement eu lieu.
cHao

0

Juste pour être complet, il y a aussi la simulation , où les actions de la machine sont dupliquées, mais en utilisant du code dont les internes peuvent être radicalement différents de la "vraie" machine. (Pensez à "simulateur de vol".) Souvent, les simulateurs compileront le "vrai" code source de la machine, mais cibleront une architecture de processeur entièrement différente, avec des systèmes d'exploitation et d'E / S entièrement différents.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.