Virtual 8086 Mode
Der Betriebsmodus {{#invoke:Vorlage:lang|flat}} – kurz VM86 –, manchmal auch V86<ref>https://www.xtof.info/inside-windows3.html#h-virtual-8086-mode</ref> wurde mit dem 80386-Prozessor von Intel im Jahr 1985 eingeführt. Da sich zu dieser Zeit Protected-Mode-Betriebssysteme noch nicht am Markt gegen das Real-Mode-Betriebssystem DOS durchgesetzt hatten, wurde mit dem {{#invoke:Vorlage:lang|flat}} die Möglichkeit geschaffen, innerhalb eines Protected-Mode-Betriebssystems Real-Mode-Programme (also vor allem DOS-Programme) auszuführen, ohne die Protected-Mode-Umgebung zu verlassen.
Bekanntestes Beispiel hierfür ist die so genannte MS-DOS-Eingabeaufforderung, die ab Windows 3.0 existierte.
Nutzung
Im {{#invoke:Vorlage:lang|flat}} können mehrere Programme – so genannte Tasks – quasi parallel ablaufen. Für jeden dieser Tasks kann über ein bestimmtes Bit im Statusregister festgelegt werden, ob er ein VM86-Task sein soll.
Im Virtual-8086-Modus verhält sich der Prozessor aus Programmsicht wie ein Prozessor im {{#invoke:Vorlage:lang|flat}}. Es ist für ein Programm aber leicht feststellbar, ob es im {{#invoke:Vorlage:lang|flat}} oder im {{#invoke:Vorlage:lang|flat}} läuft. Jedem VM86-Task stehen maximal ein Mebibyte Arbeitsspeicher zur Verfügung. Dies muss jedoch – im Gegensatz zum {{#invoke:Vorlage:lang|flat}} – nicht das erste Mebibyte im physischen Speicher sein, da die {{#invoke:Vorlage:lang|flat}}-Umgebung im Hintergrund automatisch eine Umsetzung der virtuellen Adressen in physische Adressen vornimmt.
Da ein VM86-Task in der Regel unprivilegiert läuft, hat er nur eingeschränkte Zugriffsrechte auf die Hardware oder bestimmte CPU-Register. Dies ist notwendig, da sonst ein Programm im VM86-Modus das {{#invoke:Vorlage:lang|flat}}-Betriebssystem und somit den Speicherschutz umgehen könnte. Jeder Hardwarezugriff, den ein VM86-Task tätigt, wird daher vom Prozessor abgefangen und als Ausnahmesituation ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}}) an das {{#invoke:Vorlage:lang|flat}}-Betriebssystem gemeldet, welches dann entweder das Verhalten der Hardware nachbilden (simulieren) muss, oder bei unerlaubtem Zugriff den VM86-Task und das in ihm laufende Programm beendet. Da unter DOS solche direkten Hardwarezugriffe recht häufig vorkommen, stellt dies an das Betriebssystem große Anforderungen, da eine Vielzahl an Hardwareverhalten nachgebildet werden muss. Da das Abfangen und Simulieren der Hardwarezugriffe außerdem meist langsamer ist als der direkte Hardwarezugriff, laufen viele DOS-Programme im VM86-Modus spürbar langsamer als im „echten“ {{#invoke:Vorlage:lang|flat}}.
Der VM86-Modus wurde jedoch nicht nur für diverse DOS-Fenster z. B. unter Windows („Eingabeaufforderung“), OS/2 („DOS-Modus“), Linux (über das Programm DOSEMU) benutzt, sondern auch von DOS selbst. Der Speichertreiber EMM386.EXE von MS-DOS schaltete – vom Benutzer meist unbemerkt – in den {{#invoke:Vorlage:lang|flat}}, um Zugriff auf den Speicher jenseits der 1-Mebibyte-Grenze zu bekommen. Anschließend startete er einen VM86-Task, in den das bereits laufende DOS dann verlegt wurde. EMM386.EXE benutzte die ebenfalls ab dem 80386er verfügbare Paging-Technik, um den DOS-Programmen mehr Speicher zur Verfügung zu stellen, indem es Speicher von jenseits der 1-Mebibyte-Grenze in den DOS-Adressraum einblendete ({{#invoke:Vorlage:lang|flat}}, EMS). Solche Speichermanager existieren auch für die anderen MS-DOS-kompatiblen Betriebssysteme. Sie heißen dort anders, aber ihre prinzipielle Arbeitsweise ist identisch.
Verbesserter Virtual 8086 Mode
Als Virtual 8086 mode enhancements,<ref name="softwaresolutions2018p75" /> kurz VME ({{#invoke:Vorlage:lang|flat}}), kamen bei späteren 80486-Modellen und beim Pentium weitere Features für den VM86-Modus hinzu, die es erlauben, dass bestimmte Interrupt-Serviceroutinen komplett im VM86-Modus abgearbeitet werden können, ohne dass aufwändige Taskwechsel in das {{#invoke:Vorlage:lang|flat}}-Betriebssystem erfolgen müssen. Dies ermöglicht eine Ausführungsgeschwindigkeit, die dem echten {{#invoke:Vorlage:lang|flat}} sehr nahekommt, vor allem, da unter DOS Software-Interrupts sehr häufig sind, wo sie als Aufruf ins Betriebssystem und von BIOS-Routinen benutzt werden.
Mit dem in x86-Prozessoren ab späteren 80486 CPUs verfügbaren CPUID-Funktionsaufruf lässt sich auslesen, ob ein Prozessor die verbesserten {{#invoke:Vorlage:lang|flat}} bietet. Dazu muss in Register EAX der Wert 1H stehen, wenn die CPUID-Funktion ausgeführt wird. In Register EDX findet sich anschließend im zweiten Bit (Bit 1) die Information über die Verfügbarkeit von VME.<ref name="softwaresolutions2018p75">{{#invoke:Vorlage:Literatur|f}}</ref>
Bei vielen Betriebssystemen lassen sich die CPUID-Informationen relativ einfach auslesen. Unter Linux z. B. reicht es, sich den Inhalt von /proc/cpuinfo anzeigen zu lassen. In der Zeile „flags“ findet sich vme, wenn der verbesserte VM86-Modus vorhanden ist. Beispiel (Prozessor: Pentium II):
$ cat /proc/cpuinfo | grep -m 1 -e "flags" flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pse36 mmx fxsr up
Auf einigen BSD-Systemen werden die Flags als „Features“ bei den Textmeldungen beim Systemstart ausgegeben, die auch mit dmesg auf einem laufenden System angezeigt werden können. Auch das Programm dmidecode kann bei geeigneten Systemen (DMI steht für {{#invoke:Vorlage:lang|flat}}) die CPU-Flags ausgeben.
AMD Ryzen
Beim AMD-Ryzen-Prozessor (Mitte 2017) ist die Implementierung der {{#invoke:Vorlage:lang|flat}} (VME) fehlerhaft, so dass Software, die diese Erweiterung benutzt, nicht stabil lief. Da der Virtual-8086-Modus nur im 32-Bit-Betriebsmodus verfügbar ist, betraf der Fehler nur 32-Bit-Betriebssysteme – allerdings auch dann, wenn diese virtualisiert ausgeführt wurden. Der Hardwarefehler kann meist in Virtuellen Maschinen, etwa VirtualBox, umgangen werden, indem die Unterstützung für VME per CPUID für das Gastsystem deaktiviert wird. Mit der Aktualisierung auf AGESA-Version 1.0.0.6 von Ende 2017 wurde der VME-Bug von AMD per Microcode-Update behoben.<ref name="heiseonline_3732056">Vorlage:Heise online</ref>
Bedeutung auf 64-Bit-x86-Systemen „x64“
Mit der schwindenden Bedeutung des Betriebssystems DOS ist auch der VM86-Modus nunmehr eher als historisch anzusehen und wird daher kaum noch verwendet, auch wenn er in jedem aktuellen x86-kompatiblen Prozessor noch im 32-Bit-Modus (ab „{{#invoke:Vorlage:lang|flat}}“, kurz IA-32) verfügbar ist. Auf einem 64-Bit-x86-System „x64“ (eine Erweiterung der IA-32) gibt es zwar einen „{{#invoke:Vorlage:lang|flat}}“, der verwendet wird, um 16-Bit-{{#invoke:Vorlage:lang|flat}}- oder 32-Bit-Programme auf einem 64-Bit-Betriebssystem auszuführen, jedoch fehlt darin der {{#invoke:Vorlage:lang|flat}}. Abhilfe schaffen Emulatoren wie z. B. DOSBox, die ein 8086-kompatibles System mit PC-typischer Hardwareumgebung komplett in Software nachbilden.
Jeder 64-Bit-x86-Prozessor „x64“ bietet mit dem „{{#invoke:Vorlage:lang|flat}}“ vollwertiges 32-Bit-x86, oder anders ausgedrückt: Jeder x64-Prozessor ist auch ein vollwertiger 32-Bit-x86-Prozessor („IA-32“). Läuft darauf ein 32-Bit-Betriebssystem, so ist normalerweise auch der verbesserte VM86-Modus „VME“ weiterhin verfügbar. Auch unter einem 64-Bit-Betriebssystem kann in einer virtuellen Maschine der 32-Bit-{{#invoke:Vorlage:lang|flat}}, inklusive VME, verwendet werden. Beispielsweise kann ein auf einem 64-Bit-Betriebssystem, das im 64-Bit-Modus läuft, virtualisiert ausgeführtes 32-Bit-Betriebssystem alle im {{#invoke:Vorlage:lang|flat}} vorhandenen Funktionen nutzen, und damit auch VME, wenn dieses per CPUID angezeigt ist.
In 64-Bit-Umgebungen spielt der {{#invoke:Vorlage:lang|flat}}, und damit auch der {{#invoke:Vorlage:lang|flat}} bzw. VME, keine Rolle mehr.
Weblinks
- Virtual Mode Extensions on the Pentium Processor, Robert Collins, Jim Brooks (englisch)
Einzelnachweise
<references />
{{#if:||{{#ifeq:0|10|{{#ifeq:Virtual 8086 Mode|Vorlage:Erweiterte Navigationsleiste||Vorlage:Templatetransclusioncheck Vorlage:Dokumentation/ruler}}}}}}<templatestyles src="Erweiterte Navigationsleiste/styles legacy.css" />Vorlage:Klappleiste/Anfang{{#if: |
}}{{#if: |
}}
{{#if: | {{#if: x87 ⬝ PAE ⬝ NX ⬝ AMD64/Intel 64 (x64) ⬝ HTT ⬝ VT-x/AMD-V/VIA VT ⬝ 3DNow! ⬝ MMX ⬝ SSE ⬝ SSE2 ⬝ PadLock ⬝ SSE3 ⬝ SSSE3 ⬝ SSE4 ⬝ SSE4a ⬝| class="erw-nav-bild" style="width:0; padding:0 2px 0 0; border:1px solid transparent; " rowspan="{{#expr: 0{{#if:Real Mode •
Protected Mode •
Virtual 8086 Mode •
System Management Mode •
Long Mode •
Compatibility Mode|+1}}{{#if:x87 ⬝
PAE ⬝
NX ⬝
AMD64/Intel 64 (x64) ⬝
HTT ⬝
VT-x/AMD-V/VIA VT ⬝
3DNow! ⬝
MMX ⬝
SSE ⬝
SSE2 ⬝
PadLock ⬝
SSE3 ⬝
SSSE3 ⬝
SSE4 ⬝
SSE4a ⬝
}} {{#if: Real Mode • Protected Mode • Virtual 8086 Mode • System Management Mode • Long Mode • Compatibility Mode | {{#if:Betriebsmodi||class="erw-nav-gruppe" style="white-space: nowrap;text-align: right;{{#if:|background:#;|{{#switch:grau|eigen=background:#{{#if:||E6E6FF}};|einheitlich=background:;}}}}border: 1px solid transparent;border-top: {{#if: 1|1|2}}px solid #FFF;border-bottom: {{#if: Befehlssatzerweiterungen|2|1}}px solid #FFF;padding: 0 1em;{{#if:|width:{{{Kopfbreite}}};|}}"|Betriebsmodi }} |
{{#if:Betriebsmodi | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:nein|0|0 .25em}};"|
Real Mode • Protected Mode • Virtual 8086 Mode • System Management Mode • Long Mode • Compatibility Mode }} {{#if: | |
class="erw-nav-bild" style="width:0; padding:0 2px 0 0; border:1px solid transparent; " rowspan="{{#expr: 0{{#if:Real Mode •
Protected Mode •
Virtual 8086 Mode •
System Management Mode •
Long Mode •
Compatibility Mode|+1}}{{#if:x87 ⬝
PAE ⬝
NX ⬝
AMD64/Intel 64 (x64) ⬝
HTT ⬝
VT-x/AMD-V/VIA VT ⬝
3DNow! ⬝
MMX ⬝
SSE ⬝
SSE2 ⬝
PadLock ⬝
SSE3 ⬝
SSSE3 ⬝
SSE4 ⬝
SSE4a ⬝
{{{BILD}}}
}}{{#if: | |
class="erw-nav-bild" style="width:0; padding:0 2px 0 0; border:1px solid transparent; " rowspan="{{#expr: 0{{#if:Real Mode •
Protected Mode •
Virtual 8086 Mode •
System Management Mode •
Long Mode •
Compatibility Mode|+1}}{{#if:x87 ⬝
PAE ⬝
NX ⬝
AMD64/Intel 64 (x64) ⬝
HTT ⬝
VT-x/AMD-V/VIA VT ⬝
3DNow! ⬝
MMX ⬝
SSE ⬝
SSE2 ⬝
PadLock ⬝
SSE3 ⬝
SSSE3 ⬝
SSE4 ⬝
SSE4a ⬝
}} | |
| {{#if:Befehlssatzerweiterungen | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:nein|0|0 .25em}};"|
x87 ⬝
PAE ⬝
NX ⬝
AMD64/Intel 64 (x64) ⬝
HTT ⬝
VT-x/AMD-V/VIA VT ⬝
3DNow! ⬝
MMX ⬝
SSE ⬝
SSE2 ⬝
PadLock ⬝
SSE3 ⬝
SSSE3 ⬝
SSE4 ⬝
SSE4a ⬝
| ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
| {{#if: | left|center}};border-left: 2px solid #fdfdfd;width: 100%;margin: .4em 0;border-color: #fdfdfd;padding: {{#if:|0|0 .25em}};"|
}} | ||||
{{#if: |
}}{{#if: |
}}{{#if: |