XMS

XMS  は、MS-DOS上でのメモリ拡張規格のひとつ。XMS自身はMS-DOSバージョン3.0以上を動作対象とする。MS-DOSバージョン5.0以降から公式にサポートが開始され、MS-DOSのパッケージにXMSドライバが付属し、MS-DOS自体もXMSを用いるようになった。

それ以前のバージョンのMS-DOSにおいては、マイクロソフトが一部の製品に添付していたドライバ、あるいはフリーウェアやサードパーティー製のドライバを用いることでXMSを使用することができた。また、MS-DOSバージョン5.0以降であっても、標準添付のXMSドライバではなくフリーウェアやサードパーティー製のドライバ、あるいはマイクロソフトの一部製品に添付されていたより新しいXMSドライバを用いることが可能で、機能や速度などで標準ドライバに勝るものを使用することが多かった。

1. 基本概念
-------

XMSは、次の3つのメモリ領域の規格からなる。

100000h – 10FFEFhの64キロバイト弱を使用するHMA 
10FFF0h以降のメモリ領域を使用するEMB 。このメモリ領域の内容は、XMSドライバの助けを借りてコンベンショナルメモリ間とブロック転送できる
BIOS・VRAM等が用いるA0000h– FFFFFhの、空き領域にRAMを出現させるUMBXMSは、これら3規格の総称であるが、「XMSメモリを使うプログラム」などといった文脈で使う場合は、EMBを指す場合も多い。ただし、XMS ver.1はHMAの規格であり、 ver.2でEMBとUMBが追加され、 ver.3でEMBが64MB以上のメモリに対応し、UMBも1個機能が追加された。

なお、XMSという用語はメモリ領域を指す言葉の他に、それらの領域を管理するファンクションコールを意味する言葉としても使用された。例えば「このメモリマネージャーは、EMSの他、XMSもサポートする」のように使用された場合には、ファンクションコールを意味する。

またHMAとEMBに関するファンクションコールを提供するデバイスドライバは、プロテクトメモリBIOS等の機種依存部分を吸収する役割も担っていた。//XMSドライバ が提供するHMA//とEMB//ファンクションコールを利用するお陰で、Windows 3.xは、//プロテクトメモリBIOSの直接呼出し等と、//A20ラインのハードウェア制御という機種依存処理を回避することが出来た。//date=2008年7月}}win3.x.xms。

2. HMA
------

8086では、セグメントとオフセットという2つの16ビット値を用いてメモリ管理を行っている。MS-DOSにおけるメモリ管理も、このセグメント単位で行っている。参照する実メモリはセグメント×10h + オフセットとなる。

上記の理由から、286以降のCPUを使用しているコンピュータで、アドレスライン20以上のアドレスバスを有効にした後、セグメントレジスタにFFFFhを指定すると、アクセスする実アドレスはFFFF0h – 10FFEFhとなる。すなわち、セグメント＋オフセットという8086・MS-DOSのメモリ管理の枠内で、65520バイトのメモリが余分に扱えることになる。この領域をHMAと呼ぶ。

セグメント FFFFh:オフセット 0000h = FFFF0h + 0000h = FFFF0hセグメント FFFFh:オフセット 0010h = FFFF0h + 0010h = 100000hセグメント FFFFh:オフセット FFFFh = FFFF0h + FFFFh = 10FFEFhHMAの使用には、アドレスバスが21ビット以上の80286以降のCPUと1メガバイト超のメモリが必要である。

基本的には排他的な利用となり、Windows/286かMS-DOS 5.0以降が占有する。DOS 5.0以降に関してはDOSカーネル、ディスクバッファ、また一部のユーティリティで利用する。変わったところでは、ATOK7の後期バージョンでHMAを使用するバージョン  があった。

多くのEMSドライバが使用する仮想86モード環境下においては、一般に仮想86モニタが上位メモリに存在するため、ハードウェア的にはアドレスの20ビットマスクを常に行わずに、該当する中間線形アドレスに対応するページのメモリアドレスを置き換えることでエミュレーションする対応を行っていた。

3. EMB
------

80286以降のCPUのプロテクトメモリ領域の内、HMAより上位の10FFF0h以降のメモリ領域をEMBと呼ぶ。

XMSドライバは、EMBに関してメモリ領域の空メモリサイズの取得、EMBの割当、解放、ロック、アンロック等のファンクションコールを提供するので、DOSエクステンダやWindows 3.x のスタンダードモード・エンハンストモード等、プロテクトモードを使用できるプログラムは、XMSドライバのファンクションコールを利用すれば、機種依存する処理を記述することなくプロテクトメモリを利用できた。

EMB領域はプロテクトモードでないとアクセスできないので、一般のMS-DOSアプリケーションは直接アクセスできないが、XMSドライバは、EMB同士またはEMBと任意のコンベンショナルメモリ領域とのブロック転送を行うファンクションコールも提供したので、リアルモード専用のプログラムでもXMSドライバを使用すれば、EMB領域を利用できた。

4. UMB
------

BIOS・VRAM等が用いる、A0000h – FFFFFhの空き領域にRAMを割り当てて利用するもの。

このメモリ空間は1メガバイト以内に収まっていることから、リアルモードおよび仮想86モードにおいて通常通りにアクセスすることができるため、デバイスドライバの読込用やソフトの実行・常駐用等に使用できる。MS-DOSバージョン5.0以降であればMS-DOS標準付属の仮想メモリマネージャ  がUMBを含むメモリ管理を統合しており、文字通りCPUが80386以降の場合に限られるものの、MS-DOSの機能としてUMBを用いることができる。それ以前のバージョンのMS-DOSもしくはCPUが80286以前の場合は、それぞれのプログラムがXMSファンクションを用いて明示的にUMBを使用するか、UMBに読み込むための専用のプログラムを用いることが必要であった。

UMBの実装にはチップセットや専用のRAMボードの機能を使ってハードウェア的にRAMを出現させるものと、80386以降の仮想86モードを使って、仮想メモリマネージャがメモリを割り当てるものがある。

前者はCPUが80386以降である必要性は無い。

[1] 
[2] など。

5. よく使われたドライバ
-------------

MS-DOS・Windows 9xのHIMEM.SYS +EMM386.EXE
メルコのMELEMM.SYS
I・O DATAのVMM386.EXE
QuarterdeckのQEMM
ZOBplus Hayamiの個人開発によるXMZソースコード添付
taQの個人開発によるtdpmi※別途XMSドライバが必要
K.Oginoの個人開発によるVEM486

6. 関連項目
-------

MS-DOS
Microsoft Windows
DOSエクステンダ
DPMI 
VCPI 
Expanded Memory Specification 
プロテクトモード

7. 参考文献
-------

『MS-DOSメモリ管理ソフト技法-メモリ常駐ソフト＆拡張メモリ活用プログラミング』, ISBN 978-4789834841
「インターフェース 1990年9月号」
「インターフェース 1993年10月号」
Duncan, Ray . //Extending-DOS//:A Programmer's Guide to Protected-Mode DOS , ISBN 978-0-201-56798-4

8. 外部リンク
--------

win3.x.xms[3] - Windows 3.xのスタンダード・モード/エンハンスト・モードとXMSの関連が記述されたページの一例。