Dockers DEV Site


Updates · Faq · Home 

4.3 DPMI

Einleitung

Das DOS-Protected-Mode-Interface (DPMI) entstand bei der Entwicklung von Microsoft Windows 3.0. Microsoft entschied sich für die Veröffentlichung dieses Standards und gründete 1990 zusammen mit anderen Softwarefirmen ein DPMI-Komitee zur Weiterentwicklung der DPMI-Schnittstelle. Mitglieder dieser Vereinigung sind neben Microsoft: Borland, Intel, IBM, Phar Lap, Quaterdeck, Rational Systems sowie einige weitere. Im Gegensatz zu VCPI ist der DPMI-Standard allgemeiner gehalten und deckt die folgenden Dienstleistungen ab:

Die Darstellung der Dienstleistungen zeigt jedoch auch, daß ein DPMI-Client einen großen Teil seiner Protected-Mode-Rechte an den DPMI-Server (DPMI-Host im Sprachgebrauch des DPMI-Komitees) abtreten muß. Weiterhin wird ein Anwendungsprogramm unter DPMI auf der niedrigsten Privilegstufe ausgeführt, wodurch der DPMI-Host (läuft auf höchster Privilegstufe: 0) immer in der Lage ist, die Kontrolle über alle laufenden Programme zu behalten.

Virtuelle Maschine

Ein DPMI-Host führt seine Clients immer in einer sogenannten virtuellen Maschine aus (VM-Virtual Machine). Dabei ist unter einer VM die "Umgebung" zu verstehen, in der eine Anwendung ausgeführt wird. Diese "Umgebung" muß dabei nicht zwingend mit der tatsächlich vorhandenen Hardware übereinstimmen, vielmehr dient sie im allgemeinen dazu, eine größere Funktionsvielfalt bereitzustellen. So können mehrere VM's parallel ausgeführt werden, wobei die Hardware von einem im Hintergrund laufenden Betriebssystem verwaltet und nur kontrolliert den Anwendungen zur Verfügung gestellt wird.

Unter Windows 3.x wird eine solche VM beispielsweise durch eine DOS-Box verkörpert. Eine VM besitzt in diesem Fall einen Adressraum von 1 MB plus HMA und dient in der Regel der Ausführung von Realmode-DOS-Programmen. Innerhalb einer VM können dabei mehrere DPMI-Clients zum Einsatz kommen.

Multitasking zwischen den VMs ist möglich und versetzt z.B. Windows 3.x in die Lage, mehrere DOS-Programme in verschiedenen DOS-Boxen gleichzeitig auszuführen. Der DPMI-Host unterbricht dafür die Ausführung eines Programmes regelmäßig, um die Ausführung eines anderen Programmes in einer anderen VM fortzusetzen. Dabei handelt es sich um "pre-emptives Multitasking".

Es existieren 2 verschiedene DPMI-Versionen (0.9 und 1.0), deren Unterschiede sich vor allem bei der Verwaltung der virtuellen Maschinen zeigt. Während sich unter der DPMI-Version 0.9 mehrere Clients innerhalb einer VM eine lokale Beschreibertabelle (LDT) und eine Interrupt-Vektor Tabelle (IDT) teilen, weist der DPMI-Host der Version 1.0 jedem Client seine eigene LDT und IDT zu. Clients unter DPMI-Version 0.9 erhalten dadurch Zugriff auf die Segmente der anderen Clients (die gleiche LDT!), was der DPMI-Host nicht verhindern kann. Unter DPMI 1.0 ist das durch den Schutzmechanismus des Protected Mode nicht mehr möglich.

Neben den zwei unterschiedlichen DPMI Versionen muß auch zwischen 16- und 32-Bit-DPMI-Hosts unterschieden werden. Letztere können nur auf einem Computer mit 80386 Prozessor oder höher ausgeführt werden. 16-Bit-DPMI-Hosts wurden für den 80286 entwickelt und unterscheiden sich von 32-Bit-Hosts vor allem in der Übergabe von Parametern an die einzelnen DPMI-Funktionen. Während ein 32-Bit-DPMI-Host Parameter in den erweiterten Prozessorregistern erwartet (EAX, EBX ...) beachtet ein 16-Bit-Host die erweiterten Register nicht. Weiterhin kann ein 16-Bit-Host den Paging-Mechanismus nicht benutzen (und damit auch nicht die Funktionen, die in das Paging eingreifen, bereitstellen), da ein solcher Mechanismus auf dem 80286-Prozessor nicht existiert.

DOS-Extender mit dem DPMI-Standard

Obwohl der DPMI-Standard ursprünglich für Windows entwickelt wurde, existieren mittlerweile auch DOS-Extender, die diese Schnittstelle unterstützen bzw. selbst als DPMI-Host auftreten. Dadurch ist die Ausführung von DOS-Extendern bzw. Programmen, die die DPMI-Schnittstelle benutzen, nicht mehr an Windows gebunden.

Überblick über die DPMI-Funktionen

Initialisierung des DPMI-Clients

Ein DPMI-Host stellt seine Funktionen einem im Protected Mode laufenden Programm über den Int 31h zur Verfügung. Bevor die Int 31h Schnittstelle benutzt werden kann, müssen bereits im Realmode die Voraussetzungen für die Umschaltung sowie die Initialisierung des Protected Mode durchgeführt werden. Für diesen Zweck stehen die in Tabelle 4.4 dargestellten Funktionen im Realmode (teilweise auch im Protected Mode) über den Multiplexer-Interrupt 2Fh zur Verfügung.

Fkt.-Nr. (AX) Funktion ab Version
1680 Client ist unbeschäftigt, Programmausführung weiterreichen 0.9
1686 CPU-Betriebsmodus abfragen 0.9
1687 Feststellen, ob DPMI-Host verfügbar und Protected-Mode-Einsprungspunkt ermitteln 0.9
168A Host spezifischen API-Einsprungspunkt ermitteln 1.0
Tabelle 4.4: DPMI-Funktionen im Realmode

Anmerkung: Die Rückschaltung in den Realmode kann aus dem Protected Mode Programm über den Aufruf der "normalen" DOS-Ende-Funktion des Interrupts 21h (AH=4Ch, Int 21h) erreicht werden.

Funktionen zur Verwaltung der LDT (AH=00h)

Wie bereits weiter oben erwähnt, ist für die Verwaltung der Deskriptortabellen der DPMI-Host zuständig. Im Gegensatz zum VCPI-Standard können auf diese Weise viele Probleme, die durch die direkte Manipulation der Deskriptortabellen durch einen VCPI-Client entstehen, vermieden werden. Weiterhin ist es nur dem DPMI-Host gestattet, die GDT zu verändern, Ein DPMI-Client kann nur über die in Tabelle 4.5 dargestellten Funktionen die Deskriptoren seiner LDT manipulieren. Da jeder DPMI-Client seine eigene LDT zugewiesen bekommt, bleiben etwaige Fehler auch nur auf diese LDT begrenzt und können so weder andere Clients, noch den DPMI-Host beeinflussen.

Fkt.-Nr. (AX) Funktion ab Version
0000h LDT-Deskriptor allokieren 0.9
0001h LDT-Deskriptor freigeben 0.9
0002h Realmode-Segment zu Deskriptor 0.9
0003h Inkrement für Selektor abfragen 0.9
0004h Segment gegen Auslagerung sperren 0.9
0005h Auslagerung eines Segments sperren 0.9
0006h Basisadresse eines Segments abfragen 0.9
0007h Basisadresse eines Segments festlegen 0.9
0008h Länge eines Segments setzen 0.9
0009h Zugriffsrechte/Segmenttyp einstellen 0.9
000Ah Alias für Codesegment erzeugen 0.9
000Bh Segmentdeskriptor abfragen 0.9
000Ch Segmentdeskriptor setzen 0.9
000Dh einen Selektor anfordern 0.9
000Eh mehrere Segmentdeskriptoren abfragen 1.0
000Fh mehrere Segmentdeskriptoren setzen 1.0
Tabelle 4.5: DPMI-Funktionen zur Verwaltung der LDT (Int 31h)
Zugriff auf den DOS-Speicher (AH=01h)

Wichtig für DOS-Extender ist der Datenaustausch zwischen dem Realmode-DOS-Speicher (unter 1MB) und dem Speicher über der 1MB Grenze (Extended Memory, Protected Mode). Die in Tabelle 4.6 dargestellten DPMI-Funktionen erlauben es, einem DPMI-Client DOS-Speicher zu reservieren, freizugeben oder die Größe eines DOS-Speicherblocks zu verändern. Ihre Funktion entspricht den DOS-Funktionen 48h, 49h und 4Ah.

Fkt.-Nr. (AX) Funktion ab Version
0100h DOS-Speicherblock anfordern 0.9
0101h DOS-Speicherblock freigeben 0.9
0102h Größe eines DOS-Speicherblocks ändern 0.9
Tabelle 4.6: DPMI-Funktionen für den Zugriff auf den DOS-Speicher
Funktionen zur Verwaltung von Interrupts und Exceptions (AH=02h,AH=09h)

Der DPMI-Host programmiert grundsätzlich den ersten Interrupt-Controller um und installiert für die Exceptions 00..1Fh eigene Exception-Handler. Weiterhin werden für 3 Interrupts (1Ch, 23h und 24h) Protected Mode Handler installiert, die bei ihrer Aktivierung im Protected Mode ausgeführt werden. Für alle Interrupts wird der Prozessor in den Realmode geschaltet, der jeweilige Realmode-Handler aktiviert und anschließend in den Protected Mode zurückgeschaltet. Die in Tabelle 4.7 aufgeführten DPMI-Funktionen dienen dem Abfragen bzw. Neusetzen von Interrupts bzw. Exceptionhandlern für den Real- oder Protected Mode.

Weiterhin stehen Funktionen zur Verfügung, die den Zustand des virtuellen Interruptflags beeinflussen. Dieses Interruptflag wird vom DPMI-Host für jeden Client verwaltet und entscheidet darüber, ob den jeweiligen Client Hardware-Interrupts erreichen können oder nicht.

Fkt.-Nr. (AX) Funktion ab Version
0200h Adresse eines Realmode-Interrupt Handlers ermitteln 0.9
0201h Adresse eines Realmode-Interrupt Handlers setzen 0.9
0202h Adresse eines Exception Handlers ermitteln 0.9
0203h Adresse eines Exception Handlers setzen 0.9
0204h Adresse eines Protected-Mode-Interrupt Handlers ermitteln 0.9
0205h Adresse eines Protected-Mode-Interrupt Handlers setzen 0.9
0210h Adresse eines Exception Handlers ermitteln 1.0
0211h Adresse eines (Realmode) Exception-Handlers ermitteln 1.0
0212h Adresse eines Exception Handlers setzen 1.0
0213h Adresse eines (Realmode) Exception-Handlers setzen 1.0
0900h Virtuelles Interrupt-Flag setzen 0.9
0901h Virtuelles Interrupt-Flag freigeben 0.9
0902h Virtuelles Interrupt-Flag abfragen 0.9
Tabelle 4.7: DPMI-Funktionen für die Interrupt- / Exception Verwaltung
Aufruf von Realmode-Routinen (AH=03h)

Um direkt Routinen unterhalb der 1MB Grenze aufzurufen, stehen die in Tabelle 4.8 dargestellten DPMI-Funktionen zur Verfügung. Dabei muß die Adresse der aufzurufenden Routine dem Protected Mode Programm bekannt sein.

Fkt.-Nr. (AX) Funktion ab Version
0300h Realmode-Interrupt simulieren 0.9
0301h Realmode Routine mit FAR RETURN aufrufen 0.9
0302h Realmode Routine mit IRET RETURN aufrufen 0.9
0303h Realmode Callback erzeugen (allokieren) 0.9
0304h Realmode Callback freigeben 0.9
0305h Adresse von Funktionen ermitteln, die für die Sicherung / Wiederherstellung der Prozessorregister zuständig sind 0.9
0306h Adresse der Mode-Switch Routine ermitteln 0.9
Tabelle 4.8: DPMI-Funktionen für den Aufruf von Realmode Funktionen
Funktionen für den Zugriff auf das Extended Memory (AH=05h,AH=08h)

Der DPMI-Host stellt Funktionen zur Verfügung, die Extended Memory allokieren, die Größe eines allokierten Speicherbereichs verändern, sowie einen allokierten Speicherbereich wieder freigeben können. Weiterhin existieren Funktionen, die eine Umwandlung zwischen physischen und linearen Adressen ermöglichen. Anzumerken ist, daß Extended Memory zwar über die Funktionen aus Tabelle 4.9 reserviert werden kann, für den Zugriff aber über die Funktionen 0000h..000Dh erst noch gültige Deskriptoren und Selektoren bereitgestellt werden müssen.

Fkt.-Nr. (AX) Funktion ab Version
0500h Informationen über Speicherbelegung ermitteln 0.9
0501h Speicher im Extended Memory allokieren 0.9
0502h Speicherblock im Extended Memory freigeben 0.9
0503h Größe eines Extended Memory Blocks ändern 0.9
0504h Speicherblock allokieren, der an Page-Frame Grenze beginnt 1.0
0505h Größe eines Speicherblocks ändern, der über Funktion 0504h reserviert wurde 1.0
0800h physische Adresse in Lineare Umwandeln 0.9
0801h physisches Adressmapping (Fkt. 0800h) aufheben 1.0
Tabelle 4.9: DPMI-Funktionen für den Aufruf von Realmode-Funktionen
Funktionen für die Verwaltung des virtuellen Speichers (AH=05h, AH=06h)

Für 32-Bit-DPMI-Hosts existieren Funktionen, die in die virtuelle Speicherverwaltung (Paging) des Prozessors eingreifen. So kann beispielsweise für bestimmte Speicherseiten die Auslagerung verhindert werden (Funktionen, Vgl. Tabelle 4.10).

Fkt.-Nr. (AX) Funktion ab Version
0600h Speicherbereich gegen Auslagerung schützen 0.9
0601h Speicherbereich entriegeln 0.9
0602h Realmode Speicherbereich gegen Auslagerung schützen 0.9
0603h Realmode Speicherbereich entriegeln 0.9
0604h Größe einer Page ermitteln 0.9
0506h Ermittlung der Page-Attribute eines über Fkt. 0504h res. Blocks 1.0
0507h Setzen der Page-Attribute eines über Fkt. 0504h res. Blocks 1.0
0508h phys. Adressbereich auf einen über Fkt. 0504h res. Block mappen 1.0
0509h Speicherbereich unter 1MB auf Fkt. 0504h reservierten Speicherblock mappen 1.0
050Ah Speicherblock Basisadresse und Länge eines 0504h Blocks ermitteln 1.0
050Bh Ermittlung des verfügbaren Speichers 1.0
0702h Speicherbereich bei Auslagerung bevorzugen 0.9
0703h Speicherbereich als überschreibar markieren 0.9
Tabelle 4.10: DPMI-Funktionen für die Verwaltung des virtuellen Speichers
Unterstützung der Debug-Register (AH=0Bh)

Um jedem DPMI-Client die Möglichkeit zu geben, die Debug-Register zu nutzen, müssen alle Zugriffe auf die Debug-Register über den DPMI-Host durchgeführt werden. Sobald der entsprechende Client zur Ausführung kommt, lädt der DPMI-Host die Debug-Register mit den für den jeweiligen Client aktuellen Inhalten. Tabelle 4.11 stellt die Funktionen zum Zugriff auf die Debug-Register dar.

Fkt.-Nr. (AX) Funktion ab Version
0B00h Watchpoint definieren 0.9
0B01h Watchpoint löschen 0.9
0B02h Status eines Watchpoint abfragen 0.9
0B03h Status eines Watchpoints zurücksetzen 0.9
Tabelle 4.11: DPMI-Funktionen für den Zugriff auf die Debugregister
Unterstützung speicheresidenter Programmteile (AH=0Ch)

Zur Verwaltung von speicheresidenten Protected Mode Programmen (Protected Mode TSR's) stellt der DPMI-Host seinen Clients Funktionen bereit, die in Tabelle 4.12 dargestellt sind.

Fkt.-Nr. (AX) Funktion ab Version
0C00h Protected Mode Service Callback installieren 1.0
0C01h Programm beenden und resident bleiben (TSR) 1.0
Tabelle 4.12: DPMI-Funktionen für speicheresidente Programme
Funktionen zur Verwaltung von "geteilten Speicherbereichen" (Shared Memory) (AH=0Dh)

Der DPMI-Host unterstützt die Kommunikation und den Datenaustausch zwischen mehreren DPMI-Clients durch die Verwaltung von "Shared Memory". Der Zugriff auf einen solchen Speicherbereich muß dabei beim DPMI-Host angemeldet werden und darf erst dann durchgeführt werden, wenn momentan kein anderer Client den Speicherbereich benutzt. Auf diese Weise können Datenverluste vermieden werden. Der DPMI-Host stellt dazu die in Tabelle 4.13 dargestellten Funktionen zur Verfügung.

Fkt.-Nr. (AX) Funktion ab Version
0D00h "Shared Memoryblock" allokieren 1.0
0D01h "Shared Memoryblock" wieder freigeben 1.0
0D02h Zugriff auf "Shared Memoryblock" anfordern 1.0
0D03h Zugriffsrechte auf "Shared Memoryblock" wieder abgeben 1.0
Tabelle 4.13: DPMI-Funktionen für speicheresidente Programme
Sonstige Funktionen (AH=04h, AH=0Ah, AH=0Eh)

Tabelle 4.14 stellt die Funktionen dar, die allgemeinen Zwecken dienen und keiner anderen Funktionsgruppe zugeordnet werden können.

Fkt.-Nr. (AX) Funktion ab Version
0400h Versionsnummer abfragen 0.9
0401h DPMI-Host Fähigkeiten abfragen 1.0
0A00h HOST spezifische Eigenschaften abfragen 1.0
0E00h Koprozessor Status abfragen 1.0
0E01h Koprozessor Status setzen 1.0
Tabelle 4.14: DPMI-Funktionen für allgemeine Funktionen
Initialisierung des DPMI-Clients und Umschaltung in den Protected Mode

Die Initialisierung des DPMI-Clients und des Protected Mode soll an dieser Stelle genauer beschrieben werden. Wird der Interrupt 2Fh mit dem Wert 1687h im Register AX aufgerufen und ist kein DPMI-Host im System verfügbar, dann enthält AX nach dem Funktionsaufruf einen Wert ungleich 0. Kehrt die Funktion mit dem Wert 0 in AX zurück, steht ein DPMI-Host zur Verfügung und die Register sind wie folgt belegt:

    BX      = Flags
              Bit 0    = 0 (32-bit Programme werden nicht unterstützt)
                       = 1 (32-bit Programme werden unterstützt)
              Bit 1-15     (nicht benutzt)

    CL      = Prozessor Typ
              02H = 80286
              03H = 80386
              04H = 80486
              05H-FFH  für spätere Intel Prozessoren reserviert

    DH      = DPMI-Hauptversionsnummer (dezimal)
    DL      = DPMI-Unterversionsnummer (dezimal)

    SI      = Anzahl der Paragraphen, die für Protected Mode Initialisierung
              benötigt werden (siehe unten)

    ES:DI   = Segment:Offset Adresse für Protected Mode Initialisierung

Konnte ein DPMI-Host über die Funktion 1687h identifiziert werden, muß als nächstes die in SI übergebene Anzahl Paragraphen für den DPMI-Host bereitgestellt werden (z.B. über die DOS-Funktion 48h). Die Segmentadresse dieses Bereiches muß in das ES-Register geladen werden, bevor der Sprung (FAR-Call) an die durch Funktion 1687h ermittelte Adresse durchgeführt werden kann (siehe oben, Registerpaar ES:DI).

Ist nach der Rückkehr das Carry-Flag gesetzt, befindet sich der Prozessor immer noch im Realmode, da die Initialisierung des Protected Mode durch den DPMI-Host fehlgeschlagen ist. Ist das Carry-Flag jedoch gelöscht, konnte der Protected Mode erfolgreich aktiviert werden. Die Programmausführung wird "normal" fortgesetzt. Die Selektoren in den Registern CS, DS und SS verweisen auf Deskriptoren, die die (Realmode-) Segmente vor der Umschaltung in den Protected Mode beschreiben. Der Selektor ES verweist auf einen Segmentdeskriptor, der den PSP des Programms beschreibt und die Länge 100h besitzt. Die Selektoregister GS und FS enthalten den Wert 0 (Null-Selektor). Dem Programm stehen jetzt die Funktionen der Int 31h-Schnittstelle zur Verfügung.

Eine komplette Übersicht der durch den DPMI-Host bereitgestellten Funktionen (Parameter und Rückgabewerte) befindet sich unter dpmispec.zip (33 KB).

Das DPMI-Beispielprogramm pm_06.asm muß unter einem DPMI-Host (z.B. in der DOS-Box von Windows) ausgeführt werden. Es schaltet mit Hilfe der DPMI-Funktionen in den Protected Mode und zurück.

Index
weiter >>
<< zurück ||

Last change 27/11/2022 by Docker Rocker.
This page uses no cookies, no tracking - just HTML.
Author: "Docker Rocker" ~ 2022 · [Public Git]