HIMEM.SYS und EMM386.EXE und DOS Extender
Verfasst: Do 8. Feb 2007, 12:49
So wie versprochen etwas zur Speicherverwaltung unter DOS.
Womit man oft zu tun hat ist XMS , EMS , DOS Extendern und vielleicht manchmal VCPI und DPMI.
Alle Speichermanager dienen dazu an mehr Speicher als die 640 kB zu kommen.
Zuerst zu HIMEM.SYS:
HIMEM.SYS aktiviert das A20-Gate und bietet die XMS Funktionalitaet.
Das funktioniert grob so, dass man Speicherbereiche von ueber 1 MB sich unter die 640 kB kopieren lassen kann und andersherum. Dabei schaltet HIMEM.SYS jedesmal in den Protected Mode um den Speicher ueber 1 MB adressieren zu koennen, kopiert den Bereich und schaltet in den Real Mode zurueck.
EMM386:
So nun wirds etwas komplizierter. EMM386 schaltet in den Protected Mode und legt DOS in einen Virtual 8086 Prozess. Weiterhin implementiert es den LIM EMS Standard, mit einem 64 kB Speicherfenster bei meist $E000:0000. Das heisst in dem V86 Prozess von DOS wird ein Fenster von 64 kB aus dem Speicher jenseits der 1 MB eingeblendet. Da EMM386 im Protected Mode die Kontrolle ueber Speicher und IO Zugriffe hat, sind die physikalischen Adressen und die Adressen im V86 Modus nicht zwangslaeufig gleich. Dann macht es freien RAM zwischen 640 kB und 1 MB als Upper Memory Blocks - UMBs nutzbar. DOS selbst ist in die HMA geladen. Damit ist es moeglich TSR Programme 'hochzuladen'.
QEMM386:
QEMM386 treibt die Speicherverwaltung noch eine Stufe weiter als EMM386 von Microsoft. Da der Speichermanager als oberste Instanz im Protected Mode die volle Kontrolle ueber Zugriffsrechte und Speicherzuweisung hat, kann er noch mehr. Das erste was als sinnvoll erscheint - er kann den verfuegbaren Speicher wahlweise als XMS oder EMS anbieten, je nach Bedarf des Programms.
Nun ist es so, dass die UMBs doch sehr begrenzt sind und man oft nicht alles hochladen kann, was man gern moechte. Die DOS Programme selbst interessiert jedoch oft nur, wieviel freien Speicher sie unter der 640 kB Grenze haben und wieviel EMS / XMS sie bekommen koennen. Daher wuerde es sich anbieten mehr Speicher zwischen den 640 kB und 1 MB zu bekommen um dort nach Moeglichkeit alle TSR hinzuladen.
Wie man an dem EMS PageFrame schon sieht, ermoeglicht es der 386er Speicher beliebig in den V86 DOS Prozess zu mappen. QEMM hooked alle Bios ROM Aufrufe und kann damit zweierlei Dinge:
1. Die BIOS ROMS werden aus den 1 MB des V86 Prozesses ausgemappt und durch RAM ersetzt. Wenn eine BIOS Funktion aufgerufen wird mit einem Interrupt, mappt QEMM das BIOS ROM wieder unter die 1 MB.
In diesem Fall hat man entsprechend der Groesse des BIOS mehr UMBs.
Das ROM ist in diesem Fall nicht zwangslaeufig an der physikalischen Adresse eingemappt.
oder
2. Der EMS PageFrame wird ueber das BIOS ROM gemappt. In diesem Fall hat man 64 kB mehr UMBs. Wenn das ROM eingemapped ist, ist es an der physikalisch korrekten Adresse.
Diese Technik funktioniert nicht, wenn BIOS Funktionen direkt aufgerufen werden. Das ist aber 'schlechte' Programmierung und tritt normal nicht auf.
Als Workaround kann das Optimize Programm sowas erkennen und das Mapping in 4kB (siehe Protected Mode) thunken. Das heisst man kann diese Mapping Funktionalitaet in 4 kB Bloecken einstellen.
Weiterhin bietet ein 386er Speichermanager die Basisfunktionalitaet auch IO Zugriffe abzufangen, was von einigen Emulatoren fuer Soundkarten genutzt wird. (siehe zB GUS MegaEM)
Als Referenz kann man sich dazu die QEMM Technical Notes durchlesen.
DOS Extender:
Fuer ein Programm stellt sich nun die Frage, wie kommt man an den Speicher jenseits der 640kB. XMS und EMS ist zwar nett aber kompliziert zu handhaben, da man immer 64 kB Stuecke hat und trotzdem keinen grossen zusammenhaengenden Speicher. Da hilft es nur direkt den Protected Mode zu nehmen und linearen freien Speicher zu nutzen. Meistens irgendwo ueber der 1 MB Grenze. Was so einfach klingt ist aber nicht so trivial. Denn um mit der Hardware zu kommunizieren braucht man DOS Funktionen (zB Dateien lesen) und das versteht keinen Protected Mode. Daher gibt es fuer die Protected Mode Programme einen sogenannten DOS Extender, der die Speicherverwaltung und die Schnittstelle zu DOS gewaehrleistet.
Als bekannteste Vertreter sind Watcoms DOS4GW, PMODE/W und DOS4G zu nennen.
Das ganze laeuft so ab, dass der Extender linearen Adressraum reserviert, in den Protected Mode schaltet (oder sich mit EMM386 einigt ueber VCPI / DPMI) dort das Programm hinlaed und ausfuehrt. Alle DOS Funktionsaufrufe werden abgefangen und der DOS Extender uebernimmt deren Abarbeitung. Dabei verursacht er einen Ruecksturz in den Real Mode oder V86 Mode, ruft die DOS Funktion aus, nimmt die Daten entgegen, schaltet wieder in den Protected Mode und uebergibt die Daten an das Programm.
Das heisst letztendlich, dass der DOS Extender zwar dem Programm Speicher gibt, jedoch DOS und BIOS Funktionsaufrufe durch den Moduswechsel langsam werden.
Womit man oft zu tun hat ist XMS , EMS , DOS Extendern und vielleicht manchmal VCPI und DPMI.
Alle Speichermanager dienen dazu an mehr Speicher als die 640 kB zu kommen.
Zuerst zu HIMEM.SYS:
HIMEM.SYS aktiviert das A20-Gate und bietet die XMS Funktionalitaet.
Das funktioniert grob so, dass man Speicherbereiche von ueber 1 MB sich unter die 640 kB kopieren lassen kann und andersherum. Dabei schaltet HIMEM.SYS jedesmal in den Protected Mode um den Speicher ueber 1 MB adressieren zu koennen, kopiert den Bereich und schaltet in den Real Mode zurueck.
EMM386:
So nun wirds etwas komplizierter. EMM386 schaltet in den Protected Mode und legt DOS in einen Virtual 8086 Prozess. Weiterhin implementiert es den LIM EMS Standard, mit einem 64 kB Speicherfenster bei meist $E000:0000. Das heisst in dem V86 Prozess von DOS wird ein Fenster von 64 kB aus dem Speicher jenseits der 1 MB eingeblendet. Da EMM386 im Protected Mode die Kontrolle ueber Speicher und IO Zugriffe hat, sind die physikalischen Adressen und die Adressen im V86 Modus nicht zwangslaeufig gleich. Dann macht es freien RAM zwischen 640 kB und 1 MB als Upper Memory Blocks - UMBs nutzbar. DOS selbst ist in die HMA geladen. Damit ist es moeglich TSR Programme 'hochzuladen'.
QEMM386:
QEMM386 treibt die Speicherverwaltung noch eine Stufe weiter als EMM386 von Microsoft. Da der Speichermanager als oberste Instanz im Protected Mode die volle Kontrolle ueber Zugriffsrechte und Speicherzuweisung hat, kann er noch mehr. Das erste was als sinnvoll erscheint - er kann den verfuegbaren Speicher wahlweise als XMS oder EMS anbieten, je nach Bedarf des Programms.
Nun ist es so, dass die UMBs doch sehr begrenzt sind und man oft nicht alles hochladen kann, was man gern moechte. Die DOS Programme selbst interessiert jedoch oft nur, wieviel freien Speicher sie unter der 640 kB Grenze haben und wieviel EMS / XMS sie bekommen koennen. Daher wuerde es sich anbieten mehr Speicher zwischen den 640 kB und 1 MB zu bekommen um dort nach Moeglichkeit alle TSR hinzuladen.
Wie man an dem EMS PageFrame schon sieht, ermoeglicht es der 386er Speicher beliebig in den V86 DOS Prozess zu mappen. QEMM hooked alle Bios ROM Aufrufe und kann damit zweierlei Dinge:
1. Die BIOS ROMS werden aus den 1 MB des V86 Prozesses ausgemappt und durch RAM ersetzt. Wenn eine BIOS Funktion aufgerufen wird mit einem Interrupt, mappt QEMM das BIOS ROM wieder unter die 1 MB.
In diesem Fall hat man entsprechend der Groesse des BIOS mehr UMBs.
Das ROM ist in diesem Fall nicht zwangslaeufig an der physikalischen Adresse eingemappt.
oder
2. Der EMS PageFrame wird ueber das BIOS ROM gemappt. In diesem Fall hat man 64 kB mehr UMBs. Wenn das ROM eingemapped ist, ist es an der physikalisch korrekten Adresse.
Diese Technik funktioniert nicht, wenn BIOS Funktionen direkt aufgerufen werden. Das ist aber 'schlechte' Programmierung und tritt normal nicht auf.
Als Workaround kann das Optimize Programm sowas erkennen und das Mapping in 4kB (siehe Protected Mode) thunken. Das heisst man kann diese Mapping Funktionalitaet in 4 kB Bloecken einstellen.
Weiterhin bietet ein 386er Speichermanager die Basisfunktionalitaet auch IO Zugriffe abzufangen, was von einigen Emulatoren fuer Soundkarten genutzt wird. (siehe zB GUS MegaEM)
Als Referenz kann man sich dazu die QEMM Technical Notes durchlesen.
DOS Extender:
Fuer ein Programm stellt sich nun die Frage, wie kommt man an den Speicher jenseits der 640kB. XMS und EMS ist zwar nett aber kompliziert zu handhaben, da man immer 64 kB Stuecke hat und trotzdem keinen grossen zusammenhaengenden Speicher. Da hilft es nur direkt den Protected Mode zu nehmen und linearen freien Speicher zu nutzen. Meistens irgendwo ueber der 1 MB Grenze. Was so einfach klingt ist aber nicht so trivial. Denn um mit der Hardware zu kommunizieren braucht man DOS Funktionen (zB Dateien lesen) und das versteht keinen Protected Mode. Daher gibt es fuer die Protected Mode Programme einen sogenannten DOS Extender, der die Speicherverwaltung und die Schnittstelle zu DOS gewaehrleistet.
Als bekannteste Vertreter sind Watcoms DOS4GW, PMODE/W und DOS4G zu nennen.
Das ganze laeuft so ab, dass der Extender linearen Adressraum reserviert, in den Protected Mode schaltet (oder sich mit EMM386 einigt ueber VCPI / DPMI) dort das Programm hinlaed und ausfuehrt. Alle DOS Funktionsaufrufe werden abgefangen und der DOS Extender uebernimmt deren Abarbeitung. Dabei verursacht er einen Ruecksturz in den Real Mode oder V86 Mode, ruft die DOS Funktion aus, nimmt die Daten entgegen, schaltet wieder in den Protected Mode und uebergibt die Daten an das Programm.
Das heisst letztendlich, dass der DOS Extender zwar dem Programm Speicher gibt, jedoch DOS und BIOS Funktionsaufrufe durch den Moduswechsel langsam werden.