Expanded Memory Specification
Die Expanded Memory Specification (kurz EMS genannt, oft unglücklich zu „Expansionsspeicher“ eingedeutscht) ist eine Schnittstelle zum Zugriff auf sogenannten Expanded Memory auf einem x86-kompatiblen PC im Real Mode.
Sie war für PC auf Basis von Prozessoren der Typen 8088, 8086, 80186 und ggf. auch 80286 gedacht. Mit den 8088, 8086 und 80186 stand nur ein Adressraum von maximal 1 MiB in direkter Adressierung (also ohne Speicher-Management-Funktionen = sogenannter Real Mode) zur Verfügung. Diese Einschränkung galt auch noch für Nachfolgeprozessoren, wenn sie im Real Mode betrieben werden.
Mit EMS konnte die Begrenzung auf 1 MiB physischen Speicher umgangen werden, indem weiterer Speicher in kleinen Seiten an einer bestimmten (normalerweise nicht mit RAM belegten) Stelle im 1 MiB Adressraum eingeblendet wurde.
Heutzutage hat EMS keine praktische Bedeutung mehr, weil moderne Prozessoren ausreichend Adressraum haben und moderne Protected-Mode-Betriebssysteme diesen Adressraum auch nutzen können. Moderne Hardware unterstützt auch flexibles Speichermanagement mit virtuellem Speicher. Virtueller Expansionsspeicher, der mit den Speicherverwaltungsmethoden des Protected Mode emuliert wird, erfreut sich allerdings einer großen Beliebtheit, da dieser einfacher zu bedienen ist als andere Methoden (z. B. XMS, DOS-Extender wie bspw. DPMI und VCPI oder selbst in den Protected Mode schalten) → siehe Abschnitt EMS ab dem 386er.
Entstehungsgeschichte
Mitte der 1980er Jahre, als das Betriebssystem MS-DOS den PC-Markt dominierte, reichten die 640 KB konventioneller Speicher, die es für Programme maximal zur Verfügung stellte, für viele größere Programme bereits nicht mehr aus. Es wurden verschiedene Lösungen realisiert, um auf mehr Arbeitsspeicher zuzugreifen. So wurden spezielle Steckkarten verkauft, die zusätzlichen Speicher enthielten. Diese Karten blendeten einen Teil ihres Speichers an einer bestimmten Stelle im 1-MB-Adressraum ein, so dass ein Programm darauf zugreifen konnte. Über spezielle Befehle konnte gesteuert werden, welcher Teil des Kartenspeichers (der oft zwischen 512 KiB und 2 MiB groß war) im Adressraum des Prozessors eingeblendet werden soll (Memory Bank Switching). Dadurch konnte ein Programm nie den gesamten Kartenspeicher auf einmal verwenden, sondern immer nur den Teil, der gerade eingeblendet war. Diese Karten wurden memory expander genannt, und der Speicher auf ihnen expanded memory.
Diese Karten waren inkompatibel zueinander und ein Programm, das diese memory expander nutzen wollte, musste für jede dieser Karten extra Programmfunktionen besitzen. So einigten sich im Jahre 1985 die Firmen Lotus (als Hersteller der Tabellenkalkulation Lotus 1-2-3), Intel und Microsoft auf einen Standard, der LIM-EMS genannt wurde. Meistens ist dieser Standard gemeint, wenn von expanded memory die Rede ist.
LIM-EMS
LIM-EMS schreibt einen so genannten „expanded memory manager“ (EMM) vor. Dies ist ein Gerätetreiber, der seine Funktionen über einen Software-Interrupt zur Verfügung stellt. Der expanded memory wird in Seiten (engl.: pages) zu je 16 KiB aufgeteilt. Im Adressraum wird ein 64 KiB großes Fenster (engl.: page frame oder page window) reserviert, in dem dann jeweils 4 EMS-Speicherseiten eingeblendet werden. Das EMS-Fenster belegt meist die Adressen D0000hex bis DFFFFhex; die 4 eingeblendeten EMS-Seiten beginnen an den Adressen D0000hex, D4000hex, D8000hex und DC000hex.
Der vom Kartenhersteller mitgelieferte EMS-Treiber (oft emm.sys
genannt) bietet einen genormten Satz an Funktionen an, etwa zur Abfrage der Größe des gesamten expanded memory, der Anzahl der noch freien Seiten, das Belegen und Freigeben von Speicherseiten und natürlich das Ein- und Ausblenden bestimmter Seiten in das EMS-Fenster.
Die Funktionen des EMS-Treibers stehen am Software-Interrupt 67hex zur Verfügung.
EMS ab dem 286er
Die EMS-Speicherkarten erlangten keine allzu große Verbreitung, da sie recht teuer waren. Ab dem 80386er beherrschten die Prozessoren jedoch einen speziellen Betriebsmodus, der Virtual 8086 Mode genannt wird. Mit diesem Modus lässt sich eine Real-Mode-Umgebung (wie sie DOS benutzt) innerhalb einer Protected-Mode-Umgebung emulieren. Im Protected Mode beherrschen die x86-kompatiblen Prozessoren ab dem 80386er außerdem die so genannte Paging-Technik, mit der eine Abbildung der (virtuellen) Programmadressen auf davon verschiedene reale (physische) Speicheradressen möglich wird.
Diese beiden Techniken ermöglichen einen Speichertreiber, der ein EMS-Fenster bereitstellt, und die Zugriffe darauf auf andere Speicherbereiche (jenseits der 1-MB-Grenze) umlenkt. Der EMS-Treiber emm386.exe
, der bei MS-DOS ab Version 4.00 dabei ist, oder entsprechende Pendants von Drittanbietern wie zum Beispiel qemm386.exe
von Quarterdeck, ermöglicht so die Bereitstellung von EMS-Speicher, ohne dass eine EMS-Karte im Rechner vorhanden ist.
Der Prozessor 80286 konnte bis zu 16 MiB adressieren; jedoch wurde er entworfen, um im 8086-kompatiblen Real-Mode zu starten (nur 1 MiB erreichbar) und dann in den Protected-Mode umgeschaltet zu werden (alle 16 MiB adressierbar) – ein Zurückschalten oder eine Hardware-unterstützte Emulation des Real-Mode-Betriebs war nicht vorgesehen. Erst nach einiger Zeit wurde ein Workaround gefunden, den Prozessor wieder in den Real-Mode geordnet zurückfallen zu lassen. Damit wurde es möglich, dass der EMS-Treiber die CPU kurz in den Protected-Mode schaltet, die gewünschte EMS-Seite ins untere 1 MiB kopiert, und anschließend die CPU wieder in den Real-Mode zurückkehrt. Damit wurde EMS auch für den 80286 ohne teure Zusatzkarte verwendbar.