Ändern des Maschinenzustands (Segmentbasen/-limits, Interrupts deaktivieren usw.) kann natürlich nicht erlaubt sein, oder der Gast könnte aus der VM ausbrechen oder zumindest aufhängen. (. B. durch eine Endlosschleife mit deaktivierten Interrupts ausgeführt wird)
pushf
/popf
sind etwas subtiler: erinnern, dass IF
(Die Interrupts-Freigabe-Bit, das cli
/sti
Flip) eines der Bits in EFLAGS ist.
Sie möchten, dass die physische Maschine Interrupts aktiviert, während der Gast Interrupts deaktiviert. Sie möchten aber auch, dass der Gast IF=0
anzeigt, wenn er auf dem virtuellen x86, auf dem er ausgeführt wird, die Funktion "Interrupts" deaktiviert hat. Also müssen Sie pushf
sowie popf
virtualisieren.
Stellen Sie sich vor, was passieren würde, wenn ein Client ausgeführt würde, sagen wir, 'sgdt'. –
Ich nehme an, 'srt' sollte' str' sein. Die Liste in 1 sind Anweisungen, die den privilegierten Status bestimmen können. Sie ändern den Zustand nicht wirklich, aber sie haben Zugang dazu. Die Liste in 2 sind Aufruf- und Interrupt-Gate-Befehle. Die Liste in 3 würde erlauben, auf Deskriptorinformationen zuzugreifen (lesen), und die letzte Gruppe erlaubt den Zugriff auf Flags von dem VMM. Also würden diese Anweisungen, wenn sie nicht virtualisiert sind, Informationen verlieren. Das Betriebssystem könnte erkennen, dass es in einer virtualisierten Umgebung ausgeführt wurde. Dies alles wird zu einem Problem, wenn der VMM in Ring 0 und das Betriebssystem in einem Benutzerring ausgeführt wird. –