# 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 IBM-PC-kompatible Computer, „PCs“, auf Basis von 16-Bit-x86-Prozessoren 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, der retronym so genannte Real Mode) zur Verfügung. Diese Einschränkung galt auch noch für Nachfolgeprozessoren, wenn sie im 8088/8086-kompatiblen 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. Dieser weitere Speicher war bis zum 80186 nur in Form von Speicherkarten möglich, das sind Steckkarten mit darauf verbauten Speicherbausteinen, die auch auf dem 80286 noch vielfach verwendet wurden.
Bei 32-Bit-Systemen hat EMS keine praktische Bedeutung mehr, weil moderne Betriebssysteme und Prozessoren ausreichend Adressraum haben, und PC-Betriebssysteme wie DOS, OS/2 und Windows im Protected Mode diesen Adressraum auch nutzen können. x86-Prozessoren ab dem 80386, der die 32-Bit-x86-Architektur „IA-32“ begründet, unterstützen auch flexibles Speichermanagement mit virtuellem Speicher. Auch auf PCs unter DOS, weiterhin ein 16-Bit-Betriebssystem, etablierte sich ab dem 80386er virtueller Expansionsspeicher (siehe EMS ab dem 386er), der mit den Speicherverwaltungsmethoden des Protected Mode im „Erweiterten Speicher“ (als XMS bezeichnet) emuliert wird, als besserer Ersatz und daher als Nachfolger der EMS-Speicherkarten. Auf dem 80286, der als 16-Bit-Architektur ebenfalls Speicher bis 16 MiB in Form von XMS unterstützt, wurde zwar später prinzipiell auch virtueller EMS-Speicher möglich, aber weniger effizient als auf dem 386er und neueren x86-Prozessoren. Zudem ersetzte XMS auch in Programmen zunehmend EMS, da er einfacher zu bedienen ist als andere Methoden.

## Entstehungsgeschichte

Mitte der 1980er Jahre, als das Betriebssystem MS-DOS den PC-Markt dominierte, reichten die 640 KiB 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 oft zwischen 512 KiB und 2 MiB zusätzlichen Speicher enthielten. Diese Karten blendeten einen Teil ihres Speichers an einer bestimmten Stelle im 1-MiB-Adressraum ein – diese Technik wird Memory Bank Switching bezeichnet –, so dass ein DOS-Programm, das mit EMS umgehen kann, darauf zugreifen kann. Der eingeblendete Teil durfte selbst bis zu ca. 64 KiB groß sein. Über spezielle Befehle kann gesteuert werden, welcher Teil des Kartenspeichers im Adressraum des Prozessors eingeblendet werden soll. Mit dieser Technik kann ein Programm nie den gesamten Kartenspeicher auf einmal verwenden, sondern immer nur den Teil, der gerade eingeblendet ist. Die Speicherkarten wurden memory expander genannt (von englisch expand für deutsch u. a. expandieren, ausdehnen oder ausbauen), 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, eingedeutscht auch oft „EMS-Speicher“ (neben „Expansionsspeicher“), wird in Seiten (englisch pages) zu je 16 KiB aufgeteilt. Im Adressraum wird ein 64 KiB großes Fenster (page frame oder page window) reserviert, in dem dann jeweils 4 EMS-Speicherseiten eingeblendet werden. Das EMS-Fenster belegt meist die Adressen D0000$_{hex}$ bis DFFFF$_{hex}$; die 4 eingeblendeten EMS-Seiten beginnen an den Adressen D0000$_{hex}$, D4000$_{hex}$, D8000$_{hex}$ und DC000$_{hex}$. Der Speicher aus dem die 64 KiB Fenster eingeblendet werden, konnte anfangs selbst bis zu ca. 8 MiB groß sein. Bei LIM-EMS 4.0 kann bis zu 32 MiB EMS-Speicher verwendet werden.
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 67$_{hex}$ zur Verfügung.

## EMS ab dem 386er

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 bzw. kurz VM86 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 „i386“ 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-MiB-Grenze) umlenkt. Ein EMS-Treiber ermöglicht so die Bereitstellung von EMS-Speicher, ohne dass eine EMS-Karte im Rechner vorhanden ist. Der Standard-EMS-Treiber ist EMM386.EXE von Microsoft, wie er bei MS-DOS ab Version 4.00 mitgeliefert wurde, es gibt aber auch entsprechende Pendants anderer zu MS-DOS kompatibler DOS-Versionen, z. B. DR DOS, oder Speichermanager mit EMS-Funktion von Drittanbietern, z. B. QEMM oder 386MAX, die mit den meisten gängigen DOS-Versionen kompatibel sind.

## EMM286

Der 80286-Prozessor kann bis zu 16 MiB adressieren. Wie beim Nachfolger 80386 wäre emulierter EMS-Speicher eine Möglichkeit gewesen, ohne teure EMS-Erweiterungskarten an EMS-Speicher zu kommen. Allerdings wurde der 80286 entworfen, um vom Betriebssystem in den Protected Mode umgeschaltet zu werden, wo die gesamten 16 MiB adressierbar sind, und in diesem Modus dann auch zu verbleiben – ein Zurückschalten oder eine Hardware-unterstützte Emulation des Real-Mode-Betriebs (wie später beim 80386) war beim 80286 nicht vorgesehen. Zwar startet aus Gründen der Kompatibilität auch der 80286 (wie alle späteren x86-Prozessoren der nächsten Jahrzehnte) weiterhin im 8088/8086-kompatiblen Real Mode, doch in diesem Modus sind, wie gehabt, nur 1 MiB RAM erreichbar.
Das Problem war jedoch, dass das 16-Bit-Betriebssystem MS-DOS und PC DOS sowie dafür geschriebene Programme weiterhin den Markt beherrschten, sodass auch der 80286 unter DOS stets im Real Mode betrieben wurde. Betriebssysteme, die den 16-Bit-Protected-Mode des 286er nutzten – wie bspw. Xenix 286 oder OS/2 – waren die Ausnahme bzw. hatten nicht dieselbe Verbreitung wie DOS. Deshalb wurden vielfach die für den 8088/8086 entwickelten EMS-Speicherkarten weiterverwendet. Nach und nach wurden auch spezielle, aber teurere Chipsätze für den 80286 entwickelt, die LIM-EMS innerhalb der maximal möglichen 16 MiB emulieren können, wie z. B. der NEAT-Chipsatz von Chips & Technologies. Wie zuvor auch bei den EMS-Speicherkarten lagen nun den unterschiedlichen 286er-Mainboards jeweils spezielle vom Hersteller bereitgestellter DOS-Treiber bei, da die Chipsätze nicht untereinander kompatibel waren.
Erst als nach einiger Zeit ein Workaround gefunden wurde, den 80286-Prozessor wieder geordnet in den Real Mode zurückfallen zu lassen, wurde es möglich, analog zu EMM386 einen allgemeinen EMS-Treiber zu entwickeln, der nur kurz in den Protected Mode schaltet, die gewünschte EMS-Seite ins untere 1 MiB kopiert, und anschließend wieder in den Real Mode zurückkehrt. Damit ist EMS-Speicher auch für den 80286 ohne teure Zusatzkarte und ohne speziellen Chipsatz verwendbar, allerdings mit dem entscheidenden Nachteil, dass dann die 64 kB große Speicherseite im Konventionellen Speicher liegt und diesen somit für DOS-Programme entscheidend beschneidet.

## XMS

Als Nachfolger von EMS kann XMS gesehen werden. Beide Speicherarten, die ab dem 80286er zur Verfügung stehen, sind nur unter 16-Bit-Betriebssystemen wie allen voran PC-kompatiblem DOS überhaupt notwendig, weil DOS der Kompatibilität wegen weiterhin am zum 8088/8086-kompatiblen Konventionellen Speicher festhalten musste. Mit XMS ermöglichen standardisierte DOS-Extender für VCPI und DPMI zudem eingeschränktes Multitasking, während DOS-Programme, die selbst in den Protected Mode schalten, zwar Zugriff auf den gesamten Speicher haben, aber weiterhin nur exklusiv laufen können.
Nach und nach wurden viele Programme unter DOS von EMS nach XMS portiert, um von den Vorteilen zu profitieren.