DOS時代、およびWindows3.x, 9x時代くらいまでのメモリ管理技術、特にEMSとXMS周辺のまとめメモです。
HMA, UMA, UMB, EMB, EMM, EMS, EMM386.{SYS|EXE}, QEMM, CEMM, XMS, HIMEM.SYS, LOADHIGH
これらの略語について、簡単に解説+まとめています。
+--------------------------------+ 32M(max) | | | expanded memory board +----------------------------------------+ | | | +--------------------------------+ 0 | | +--------------------------------+ | | | | | build-in memory | | | | | +--------------------------------+ nM(*1) | | | | | eXtended Memory (1M - nM)(*1) | | | | | | +-----------------------------+ 10FFEFh(=FFFF:FFFFh) | | | High Memory Area | | | | (= 10000h - 10FFEFh) | (FFEFh = 64K - 16(Fh)) | | | (= FFFF:0010h - FFFF:FFFFh) | | +--+-----------------------------+ 1M = 1024K = 100000h(=FFFF:0010h) | | | Bios Program Area | (*2) | | +-----------------------------+ 1016K = FE000h | | | Read Only Memory | (*2) | | +-----------------------------+ 960K = F0000h | | | | | Upper Memory Area (640K - 1M) | | | | | | +-----------------------------+ (??) | | | expanded memory page frame | (64K) <--------------------------------+ | +-----------------------------+ (??) | | | +-----------------------------+ (?) | | Disk Adapter | (*2) | +-----------------------------+ 800K = C8000h | | | +-----------------------------+ 752K(-1b) = BBFFFh | | Color Display Buffer | (16K)(*2) | +-----------------------------+ 736K = B8000h | | | +-----------------------------+ 708K(-1b) = B0FFFh | | Monochrome Display Buffer | (4K)(*2) | +-----------------------------+ 704K = B0000h | | +--+-----------------------------+ 640K = A0000h | | extended BIOS data area | (*3) | +-----------------------------+ 639K = 9FC00h | | | Conventional Memory (0 - 640K) | | | +--------------------------------+ 0 +--------------------------------+ | | | IBM expanded memory adapter | | (XMA) | +--------------------------------+ *1 : "nM" = 16MB on 80286, 4GB on 80386/i486 *2 : "IBM Personal Computer Technical Reference manual"(IBM PC 5150)掲載 *3 : MS-KB37242掲載
8086/8088のアドレスバス20bitによる制限(1MB)および、IBM PC 5150を発祥とするIBM PC互換機のメモリ配置により、OSやユーザープログラムが利用可能な640KBのメモリ領域。ただし、アドレス0番地 - 3FFh番地までは割り込みベクタとして予約されているのに加え、搭載されている物理RAM容量の制限も加わり実際に利用可能な領域は640KBよりさらに少なくなる場合もある。
事実、IBM PC 5150の最小メモリモデルは16KBしか搭載されていない。640KB以上の領域にディスプレイやROM BIOSが配置されているのは、MMU(メモリ管理ユニット)など電子回路のレベルで調整されている。
640KB - 1MBの領域。正確にはアドレスバス20bitにおける、A0000h以上 - FFFFFh以下の領域。
ビデオアダプタやデバイスドライバなどのバッファ領域、およびFFFFFh近辺にはROM BIOSが配置されている。
アドレスの後ろ(高位)にROM BIOSが配置されるのは、x86系ではCPUのリセット後に最初に命令がフェッチされるアドレスがアドレスの最大値近辺に設定されている為である。(CS:F000h, IP:FFF0h, 物理アドレスはFFFF0hになり、80286以降は残りのアドレスバスもCPUリセット後は全てのbitが1になっている。)
384KBの全領域が隙間無く埋まっているわけではない。後述のEMSは、所々に空いている"穴"を使って実現している。
Compaqなど一部のOEM製品ではマザーボード上に1MBのRAMを搭載するようになった。その場合、640KBまではConventional Memoryとして使われるが残りの384KBを(電子回路レベルで)1MBより上の領域にずらすようになっていた。
というのは、UMA領域は既にROM BIOSや各種バッファ領域で使われていたからである。
HIMEM.SYSなどは、もし利用可能であれば extended memory block に含めるようになっていた。あるいは、extended memoryの最初の384KBとして使われるようになっていた。
初期のIBM PCおよびその互換機では、バンク切り替え機能を持つ専用メモリカードを拡張バスに接続し、メモリ増設に対処していた。
このメモリ領域は "Expanded Memory" と呼ばれ、このメモリ領域を管理するのが "Expanded Memory Manager"(EMM)である。
またその仕様をまとめ上げたのが "Expanded Memory Specification"(EMS) である。
EMSでは16KB単位でバンク切り替えを行い、これをページと呼んだ。4ページ=64KBを連続して割り当てた領域をページフレームと呼んだ。
各種操作はEMMにより隠蔽され、ユーザープログラムは気にする必要がない。サポートされるメモリ総量は32MB(=2048ページ)まで。
ページフレームは、Conventional Memory領域ではなく UMA領域に設定するのが殆どである。ただしその場合、ROM BIOSやビデオ・デバイスドライババッファ領域と衝突しないよう調整する必要があった。
後述する "eXtended Memory" に含まれるアドレス領域の一部がHMAである。具体的には 100000h - 10FFEFh までの 64KB(-16byte) の領域となる。なぜこのような中途半端な領域に設定されたのかというと、80286のアドレスバスが24bitに拡張されたことが影響している。
8086/8088/80186/80188まではアドレスバスが20bitだったので、「セグメント:オフセット」方式で指定出来る物理アドレスは
FFFFFh
までが最大だった。これは例えば
FFFFh:FFFFh
と指定しても、繰り上がって20bitを超えた分は無視されてしまうことを意味する。
80286になりアドレスバスが24bitになったおかげで、
FFFFh:FFFFh → 10FFEFh
にもアクセス可能となった。これは実際には80286のバグだったが、有効利用出来るので残された。これによりアクセス出来る範囲は、
FFFFh:0010h - FFFFh:FFFFh
までとなり、サイズは丁度 64KB - 16Byte となる。
もちろん、これは物理RAMが1MB以上搭載されている場合でなおかつ80286以上のCPUが搭載されている場合だけ利用可能となる。
物理RAMが1MB以上搭載されている場合で、なおかつ80286以上のCPUが搭載されている場合に利用出来る、1MB以降のメモリ空間。
この領域には、286以降のプロテクトモードを利用しないとアクセス出来ない。(プロテクトモードが提供するセグメントディスクリプタを用いたセグメント・オフセット指定を行う必要がある。)
IBMによる独立したメモリアダプタと、ソフトウェアドライバによりアクセス出来るメモリ領域。EMSやXMSとは特に関わってこない。
MS-DOSおよびWindows3.1の時代までのメモリ管理およびその用語は、大きく二つのメモリ管理方式に分類される。
HMA, UMA, UMB, EMB, EMM, EMS, EMM386.{SYS|EXE}, QEMM, CEMM, XMS, HIMEM.SYS, LOADHIGH などの略語が多いが、上記二つの方式に分類し、歴史の流れを簡単に追っていく。
その前に、メモリ管理方式に影響を与えた二つの技術要素 "DOS extender" と "Terminate and Stay Resident"(TSR) について簡単にまとめ、予備知識としておく。
MS-DOSは基本的にx86のリアルモードで動作するOSである。従って、80286以降のCPUを搭載したとしても、OS自身はx86のプロテクトモードの仕組みを活用出来ない。
ユーザープログラム側でプロテクトモードの機能を利用する為の拡張用ソフトウェア、それが "DOS extender" と呼ばれるソフトウェア群である。 "DOS extender" は特定のソフトウェアを指すのではなく、x86プロテクトモードの機能をユーザープログラムが利用する為のデバイスドライバなど特殊なソフトウェア全般を指す。ここでは取りあげないが、VCPIやDPMIも含まれる。
注意したいのは、1MB以上のメモリを活用する為のソフトウェアの一部もDOS extenderに分類される点である。
というのは、アドレスバス24bitの80286であっても、実際に1MBを越える領域にアクセスするにはプロテクトモードを有効にし、セグメントディスクリプタを使ってセグメント:オフセット指定をしなければならないためである。
これから紹介する "eXtended Memory" を活用するソフトウェアは全て、DOS extenderに属することになる。
また、 "Expanded Memory" を活用するソフトウェアの一部も、x86のプロテクトモードを活用する為、DOS extenderに属する。
さらにWindows95/98/Meも、DOS上で起動してプロテクトモードを利用するという意味では DOS extender に分類することが出来る。
DOS extenderは、それを使うユーザープログラムから見ればプロテクトモードのOS(およびOSの提供するサービス)として存在し、リアルモードで動作するDOSから見れば一つのDOSアプリケーションとして見える。一種の疑似OS、仮想環境とも呼べるものんだった。
+--------------------+ +--------------+ +----------------+ | アプリケーション |---->| DOS extender |---->| DOS | | (プロテクトモード) |<----| |<----| (リアルモード) | +--------------------+ +--------------+ +----------------+
DOS extender は Phar Lap社の "286|DOS Extender", "386|DOS Extender" から始まり、様々なベンダーから発表された。また、Tenberry Software の "DOS/4GW" はPCゲームの世界で広まり、"DOOM"で採用された事で有名になった。
各社から様々に提供されたDOS extenderであるが、共通仕様としてVCPIを経てDPMIに収斂していく。その流れについては本記事では割愛する。
DOSは基本的にシングルタスクのOSであり、ユーザープログラムは終了時にINT 21H/4CHを呼ぶことでDOSのシェル(COMMAND.COM)に制御を戻す。しかし、終了時にINT 27H or INT 21H/31Hを呼ぶと、ユーザープログラムのロードされたアドレスが解放されないままCOMMAND.COMに戻ることが出来る。つまり、プログラムの実行イメージがメモリ上に残り、他のプログラムによって壊されない状態になる。
INT 27H は "Terminate But Stay Resident" と呼ばれる為、この機能を使うプログラム群を "TSR" と呼んだ。INT 27Hではプログラムのセグメント64KBをそっくりそのままメモリに残すことが出来る。MS-DOS 2.0で導入された INT 21H/31H ("Kepp Process") はメモリ制限が無くなると共に、プログラムがexitコードを返せるようにした。
「メモリ上にプログラムを残せる」、この効果をTSRプログラム群がどのように活用したかというと、割り込みベクタを上書きして自身の割り込みハンドラを指すようにした。これにより、キーが押されたなどの割り込みイベントに応じて、自身のプログラムを実行することが出来た。
これを活用して擬似的なマルチタスクであったり、独自のデバイスドライバ、スケジューリング機能などのユーティリティプログラムが開発された。
TSRは技術的には「OSのハイジャック」と同義であり、コンピュータウィルスにより悪用されたり、複数のTSR間での衝突や相性問題を引き起こすこともあった。
Windows95以降の、マルチタスクが前提のOSが広まるにつれ、TSRは次第に衰退していった。
本記事ではDOSから初期Windows時代までのメモリ管理について焦点をあてているが、TSRもそれに少なからず影響を与えている。
通常はTSRはコンベンショナルメモリに配置されてしまう。コンベンショナルメモリを少しでも空ける為、TSRをUMAに配置出来るようにしたものが"LOADHIGH"コマンドであるといえる。
上でも説明したが、バンク切り替え機能を持つ専用メモリカードを拡張バスに接続して使う。
16KB(ぺージ)単位でバンク切り替えを行い、4ページ=64KBを連続して割り当てた領域がページフレーム。ページフレームはUMA上の空き領域に設定されるか、時代が下るとコンベンショナルメモリの一部に大きめのページフレームを確保する場合もあった。
この実装には二つのタイプがあった。一つは最も基本的な、専用メモリカードを使ってハードウェア的に実装するタイプ。もう一つは80286以降のCPUで、プロテクトモードで利用可能な1MBを超えるメモリ領域を専用メモリカードに「見立てる」ソフトウェアエミュレーションタイプ。
原点となる、専用メモリカードを使用したタイプ。プロテクトモードが利用出来る以前に実装された方式なので、8086/8088/80186/80188で利用出来る。バンク切り替えはハードウェア的に行われる。
+-------------------------+ | Expanded Memory Board | | (max 32MB = 2048 pages) | | +--------+ | +-------->| page N | | | (...) | | | | ... | | 1MB +----------------------+ | | +--------+| | | UMA | +------->| page 3 |+ | | | | | +--------+| | | +-----------------+ | +------>| page 2 |+ | | | expanded memory | | | | +--------+| | | | page frame |------+----->| page 1 |+ | | | (16KB) | | | | (64KB) | | | +-----------------+ | | +--------+ | | | +-------------------------+ 640KB +----------------------+ | (...) |
メインメモリが1MB以上搭載されていて、なおかつ80286以上のCPUを搭載している場合に利用可能。
プロテクトモードを利用することで1MB以上の領域の一部を専用メモリカード上のメモリ領域に「見立てて」、UMA中のページフレームにコピーする。一部には、メインメモリではなく補助記憶装置上のファイルを用いるドライバも存在し、この場合は8086/8088などリアルモードのみのCPUでも利用出来た。(HP200LX, CPUは80C186(CMOS版80186) の"LXEMM"はこの方式)
| (...) | +----------------------+ | page 2 (64KB) |<---+ +----------------------+ | | (...) | | +----------------------+ | | page 1 (64KB) |<---+ +----------------------+ | | (...) | | 1MB +----------------------+ | | UMA | | | | | | +-----------------+ | | | | expanded memory | | | | | page frame |------+ | | (16KB) | | | +-----------------+ | | | 640KB +----------------------+ | (...) |
このタイプのEMMは、プロテクトモードを利用している為 DOS extender に含まれる。
80386以降のCPUでは、仮想86モードでCPUの仮想メモリ機能を利用したEMMを実現する機能もある。MS-DOS用ソフトウェアの互換性のために、Microsoft Windows Me までこのタイプがサポートされていたらしい。
専用メモリカードを使ったハードウェアタイプの"Expanded Memory"が登場。"Expanded Memory Manager"(EMM)も各社より発表される。それぞれ専用メモリカードも併せて発売された。
AST | remm.sys |
IBM | ps2emm.sys |
AT&T | aemm.sys |
Intel | emm.sys |
80386以降のCPUで、プロテクトモードでアクセス可能な1MBoverの領域を"Expanded Memory"として扱うソフトウェアエミュレーションタイプのEMMが登場してくる。"Compaq Expanded Memory Manager"(CEMM)が Compaq DOS 3.31に搭載される。80386が必要。
また同年、Expanded Memoryの仕様である "EMS 4.0" が策定された。
これまでは Lotus, Intel, Microsoft によりまとめられた"LIM EMS"と呼ばれるExpanded Memoryの仕様と、ASTがまとめた"Enhanced Expanded Memory Specification", EEMSの二つが存在していたが、 EMS 4.0 になり両方の内容が統合された。
ソフトウェアエミュレーションタイプは、紛れもなく 1MB を超える "eXtended Memory" を使う。従って、EMSは徐々にXMSに包含されていくようになる。
基本機能はWindows/386で実装され、".SYS"で提供されたのがMS-DOS 4.xまで。より柔軟になって ".EXE" になったのが MS-DOS 5.x以降となる。
プロテクトモードで動作するWindowsとでは機能衝突も発生したらしく、下記のように、Windows3.0 Standard ModeではEMM386.SYSやEMM386.EXEを無効化するようKBが上げられている。
なお、とくにEMSに限って言えば、ハードウェアタイプのEMSであれば Windows/286(v2.0)でも利用可能になっていた。
"eXtended Memory"、通称XMS(eXtended Memory Specification)はMS-DOSで 1MB 以降のメモリを扱う為のメモリ管理方式の一つ。
MS-DOSが「公式に」対応したのはMS-DOS 5.0からだが、それ以前にも、サードパーティ製のフリーソフトでXMSに対応することができた。XMS自身の仕様としてはMS-DOS 3.0以上を動作対象としている。
XMSは三つのメモリ領域の規格からなる。
規格のバージョンとしては、以下の3つがある。
WindowsやDOSがXMSのサポートを開始した流れは、大雑把に次のようになる。
※MS-DOS 5.0以前でも、サードパーティ製のフリーソフトでUMBを利用するタイプは存在した。
※この時代はとにかく、CONFIG.SYSやAUTOEXEC.BATを使ってUMBの空き領域の設定やEMM386のロードのオプションを調整する必要があった。
まずHIMEM.SYSを "DEVICE" でコンベンショナルメモリにロードする。
device=c:\dos\himem.sys
→これでXMSによりHMAおよびEMBが使用可能になる。
続いてEMM386.EXEをコンベンショナルメモリにロードし、EMSとUMBに対応する。
device=c:\dos\emm386.exe umb
なお他のデバイスドライバをEMBにロードするのであれば
DEVICEHIGH=foobar.sys
とする。
コマンドプロンプトやAUTOEXEC.BAT中からプログラムをUMBにロードするには、"LOADHIGH"("LH")コマンドを利用出来る。TSRで使われた。
DOSカーネルをHMAにロードするには
dos=high
をconfig.sysで指定する。デフォルトではコンベンショナルメモリにロードされる。
DOSカーネルにUMBも管理させるのであれば、
DOS=HIGH,UMB
としてUMBオプションを付ける。