Virtuelle Betriebssysteme

VMware gegen Virtual PC

Virtueller Prozessor

Die CPU ist der Hauptbestandteil des echten und des virtuellen PCs. Die Intel-Architektur hat allerdings hinsichtlich der Abbildung virtueller Maschinen gegenüber den Mainframes einige Schwächen. Letztere sind schon architektonisch auf VMs ausgelegt. Intel-Entwickler hatten niemals einen virtuellen Rechner als primäres Ziel vorgegeben.

Die Intel-Architektur der 32-Bit-CPUs bietet vier verschiedene Privilegien an, mit denen dem Betriebssystem, Treibern und Programmen unterschiedliche Rechte zugewiesen werden können. Normalerweise laufen OS und Treiber im so genannten Ring 0 (kernel mode) und Applikationen im Ring 3 (user mode). Der Trick beim Erzeugen eines virtuellen Systems ist, dieses im Ring 3 ablaufen zu lassen.

Wenn das Betriebssystem des virtuellen Rechners nun einen Befehl ausführen will, der nur im Ring 0 gestattet ist, löst der Prozesser eine Exception aus. Routinen zur Behandlung dieser Ausnahmen können dann den privilegierten Befehl emulieren. Dabei behält das Wirtssystem die volle Kontrolle über das System. Die wichtigste Voraussetzung für das Funktionieren dieses Ansatzes ist, dass der Prozessor bei jeder unberechtigt durchgeführten privilegierten Anweisung eine Exception auslöst.

Dummerweise sind die x86-Prozessoren nicht ganz so gründlich bei den Exceptions. Beispielsweise werden Speicherzugriffe beim x86 über eine GDT (Global Descriptor Table) abgewickelt. Diese GDT ist eine globale Ressource und wird vom Betriebssystem verwaltet. Eigentlich müsste jeder direkte Zugriff auf diese Ressource als privilegierte Handlung angesehen werden und dementsprechend im User Mode nicht erlaubt sein. Der x86 behandelt die LGDT-Anweisung (Load Global Descriptor Table) auch als privilegiert. Allerdings führt SGDT (Store Global Descriptor Table) nicht zu einer Schutzverletzung. Allein diese Inkonsistenz verhindert es, die GDT zu "virtualisieren".

Um dennoch virtuelle Maschinen auf IA32 realisieren zu können, müssen sich die Entwickler eine ganze Menge einfallen lassen. Connectix untersucht beispielsweise Code, der im Kernel Mode laufen soll, vor der Ausführung und ändert kritische Sequenzen um.