Welche Schritte führt MS-DOS durch, um eine COM- oder EXE-Datei in den Speicher zu laden? Gibt es im Internet noch Hinweise darauf, wie dies geschieht? Das Beste, was mir einfällt, ist möglicherweise ein Verweis auf die Dosbox-Quellen.
Antwort
Zu viele Anzeigen?Wenn command.com aufgefordert wird, eine .com- oder .exe-Datei auszuführen, wird der Interrupt-Dienst 21h/AH=4B, der EXEC-Dienst, aufgerufen. Es ist Sache des aufrufenden Programms, dies zu tun:
- einen DOS-EXEC-Parameterblock erstellen (siehe http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html ) (enthält Informationen über Umgebungsvariablen, Befehlszeilenargumente, FCBs und Registerwerte bei der Rückkehr)
- den gesamten vom aufrufenden Programm nicht verwendeten Speicher freigeben
- Einrichten der Register für das aufrufende Argument
- ah = 4Bh ('EXEC'-Dienstart)
- al = 00h (Funktion "Laden und Ausführen")
- ds:dx -> Programmname
- es:bx -> ptr zum Ausführungsparameterblock
- Anrufunterbrechung 21h
- bei Rückkehr Stapelzeiger zurücksetzen und auf Fehler prüfen.
Wenn der Interrupt 21h aufgerufen wird (hier wird es für mich unklar):
- ein seitenorientierter Speicherblock wird zugewiesen
- die Dateierweiterung wird ignoriert, stattdessen prüft DOS die ersten beiden Bytes der Datei auf die Signatur "MZ" oder "ZM", wenn es sich um eine EXE handelt, und keine Signatur für COM.
für Exe:
- exe-Header wird für anfängliche Registerwerte gelesen
- Codeabschnitt aus der Exe in den Speicher kopieren
- Umzugsliste (siehe http://en.wikipedia.org/wiki/Relocation_table ) wird gelesen und Fernzeiger werden im Speicher angepasst
- Setup-Registerwerte
- AL,AH Laufwerksbuchstabenstatus
- DS,ES -> PSP-Segment (siehe http://en.wikipedia.org/wiki/Program_Segment_Prefix )
- SS:SP -> Stapelzeiger (definiert im Exe-Header)
- Sprung zu CS:IP -> Einstiegspunkt (definiert im Exe-Header, relativ zum Programmstart)
für com:
- Kopieren der gesamten .com-Datei in den Speicher
- Setup-Registerwerte
- AL,AH Laufwerksbuchstabenstatus
- CS,DS,ES,SS -> PSP-Segment
- SP = Offset des letzten verfügbaren Worts im ersten 64k-Segment
- Sprung zu IP=100h
Das Programm sollte nun ausgeführt werden.
Anmerkungen:
In Microsofts KB-Dokument "Order of Precedence in Locating Executable Files" wird erwähnt, dass die Verwendung der "MS-DOS EXEC-Funktion (Interrupt 21h Service 4Bh)" für die Ausführung von .com- und .exe-Dateien http://support.microsoft.com/kb/35284
Wir können uns also die Interrupt-Liste von Ralph Brown auf Int 21/AH=4Bh ansehen
- http://www.cs.cmu.edu/~ralf/files.html
- Int 21/AH=4Bh http://www.delorie.com/djgpp/doc/rbinter/id/51/29.html
- Int 21/AH=4Bh http://www.ctyme.com/intr/rb-2939.htm
und ein Beispiel für die Verwendung:
- Die Kunst der Montage / 19.1.1.1 Laden und Ausführen http://webster.cs.ucr.edu/AoA/DOS/ch19/CH19-1.html#HEADING1-10
und das Dos-Exe-Header-Format:
(dies basiert auf einigem Googeln, also bitte fügen Sie gerne Vorschläge hinzu)