# Upper Memory Block

UMB (englisch „Upper Memory Block“ oberer Speicherblock) ist ein Begriff aus der Speicherverwaltung von DOS und bezeichnet die frei nutzbaren Bereiche im UMA (Upper Memory Area, englisch für „oberer Speicherbereich“) oberhalb des konventionellen Arbeitsspeichers von 640 KB (= 655.360 Bytes) und unterhalb der 1-MB-Grenze (= 1.048.576 Bytes).

## Details

Der Adressraum oberhalb der Speicheradresse A0000$_{hex}$ (entspricht 640 KB) ist für Zusatzhardware (Grafikkarten, SCSI-Controller und Ähnliches) und für das BIOS reserviert. Bei den ersten IBM PCs (wie dem IBM 5150), die gerade einmal 64 KB RAM als Arbeitsspeicher hatten, bedeutete dies keine nennenswerte Einschränkung. Später wurden die Programme jedoch immer speicherhungriger, viele verlangten, dass ein sehr großer Teil des konventionellen Speichers (unterhalb von A0000$_{hex}$) für sie selbst verfügbar war. Dies stellte dann ein Problem dar, wenn auch noch diverse Treiber und TSR-Programme in den konventionellen Speicher geladen werden sollten – der verbleibende Speicher war dann letztlich für viele Programme zu klein. Zugleich wurde der Adressraum oberhalb von A0000$_{hex}$ aber nur in den seltensten Fällen von Zusatzhardware und dem BIOS komplett belegt; meist blieben hier zwischen 128 und 256 KB ungenutzt, und zwar nicht direkt nach dem Ende des konventionellen Speichers bei A0000$_{hex}$ (hier sitzt die Grafikkarte), sondern in der Mitte des reservierten Bereiches, maximal von C8000$_{hex}$ bis F8000$_{hex}$.
Konventionelle DOS-Programme können diesen speziellen Adressraum zwar adressieren und problemlos nutzen, allerdings befindet sich hier eben kein Arbeitsspeicher, da der Bereich ja für Zusatzhardware freigehalten wird. Möchte man Programme, Treiber oder TSR-Programme nicht in den konventionellen Speicher laden, sondern dafür UMBs nutzen, benötigt man einen Treiber, der mit Hilfe von speziellen Registern des Chipsatzes bei 80286-basierten PCs oder mit Hilfe der ab dem i386 vorhandenen MMU gewöhnlichen RAM von höheren Adressen (jenseits der 1-MB-Grenze) in diesen Adressraum „verlegt“. Solche Treiber sind beispielsweise EMM386.EXE oder UMBPCI.SYS. Diese sorgen dann dafür, dass RAM in den UMBs sichtbar wird. Der konventionelle Speicher muss unter DOS immer ein einziger zusammenhängender Adressraum sein, daher sind die UMBs nicht direkt als Teil des konventionellen Speichers verwendbar. Damit nun trotzdem Treiber und TSR-Programme in dieses RAM geladen werden können, muss auch das Betriebssystem mitspielen; es stellt die neuen Befehle DEVICEHIGH (für Treiber) und LOADHIGH (kurz LH, für TSR-Programme) zur Verfügung, die ihr Ziel jeweils in UMBs laden. Außerdem wurde in MS-DOS 5.0 ein neuer Systemaufruf (via Interrupt 21$_{hex}$, Funktion 5803$_{hex}$) eingeführt, mit dem ein Programm dem Betriebssystem signalisiert, dass es für Speicheranforderungen auch Speicher aus der UMA akzeptiert. Alternativ kann der XMS-Treiber (z. B. HIMEM.SYS) explizit angesprochen werden, um über die API-Funktion 10$_{hex}$ Speicherbereiche in der UMA zu reservieren. Auf diese Weise kann die Menge an frei bleibendem konventionellen Speicher erhöht werden, so dass für gewöhnliche Anwendungsprogramme und Spiele mehr Speicher übrig bleibt.
Von Digital Research wurde die UMB-Nutzung im Mai 1990 mit DR DOS 5.0 eingeführt, Microsoft zog im Juni 1991 mit MS-DOS 5.0 nach.

## Begriffsverwirrung

In den deutschsprachigen MS-DOS-Versionen, die die High Memory Area (HMA) unterstützten, wurde diese als „oberer Speicherbereich“ bezeichnet. Als die Unterstützung für UMBs hinzukam, verwendete man dann für diese den Namen „hoher Speicherbereich“. Die Benennung war also im Deutschen gerade umgekehrt gehandhabt wie im Englischen, was zusammen mit der insgesamt schweren Verständlichkeit der MS-DOS-Speicherverwaltung zu viel Verwirrung bei den Anwendern führte. Erst unter Windows 95 wurden die deutschen Begriffe vertauscht, so dass sie nun den Englischen direkter entsprachen.