x86-Programmierung und -Betriebsarten (Teil 6)

Einstieg in den und Ausstieg aus dem Virtual-8086-Mode

Der Prozessor wird in den Virtual Mode versetzt, wenn das Flag VM (Virtual Mode) im EFlag-Register gesetzt wird. Das ist nur durch Codes mit Privilegierungsstufe 0, einen Task Switch mit Hilfe eines 80386-TSS oder eines IRET-Befehls, der die EFlags mit gesetztem VM-Bit vom Stack holt, möglich. Beachten Sie, dass der Prozessor dazu bereits im Protected Mode arbeiten muss. Ein direkter Einstieg vom Real in den Virtual-8086-Mode ist nicht möglich. Ein Task Switch lädt die EFlags automatisch aus dem TSS des neu gestarteten Tasks. Dadurch ist es nicht notwendig, dass das Betriebssystem von sich aus bei jedem Task Switch entscheidet, ob der neu gestartete Task im Protected oder Virtual-8086-Mode ausgeführt werden soll. Vielmehr nimmt das TSS dem Betriebssystem diese Entscheidung ab, es muss nur beim Erstellen des TSS für den Task einmal über den EFlag-Eintrag festlegen, ob der Task dann immer im Virtual-8086-Mode ausgeführt wird. Ein 80286-TSS kann durch die Beschränkung des Flag-Eintrags auf 16 Bit das höherwertige Wort im EFlag-Register, in dem sich das VM-Flag befindet, dagegen nicht verändern.

Umgekehrt verlässt der Prozessor den Virtual Mode, wenn das VM-Flag gelöscht wird. Gelöscht wird das VM-Flag durch ein 80386-TSS oder einen Interrupt beziehungsweise eine Exception, die ein Trap- oder Interrupt Gate aufruft. Die CPU kehrt dann in den gewöhnlichen Protected Mode zurück, um andere (Protected Mode) Tasks auszuführen. In Abbildung "Noch übersichtlich" ist dies genauer dargestellt.

Im Virtual Mode stehen alle 8086-Register, ihre Erweiterungen auf 32 Bit (durch das vorangestellte E) und zusätzlich die spezifisch mit dem 80386 eingeführten Register wie FS, GS, Debug-Register et cetera zur Verfügung. Außerdem können auch die mit dem 80186, 80286 und 80386 eingeführten Befehle wie BOUND, LSS et cetera benutzt werden. Den Virtual-8086-Mode könnte man also eher als Virtual-i386-Real Mode bezeichnen.