home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/歴史/DOS時代のメモリ管理(EMS,XMS周辺)

技術/歴史/DOS時代のメモリ管理(EMS,XMS周辺)

技術 / 歴史 / DOS時代のメモリ管理(EMS,XMS周辺)
id: 632 所有者: msakamoto-sf    作成日: 2010-04-02 11:21:43
カテゴリ: Assembler Windows 

DOS時代、およびWindows3.x, 9x時代くらいまでのメモリ管理技術、特にEMSとXMS周辺のまとめメモです。

HMA, UMA, UMB, EMB, EMM, EMS, EMM386.{SYS|EXE}, QEMM, CEMM, XMS, HIMEM.SYS, LOADHIGH

これらの略語について、簡単に解説+まとめています。


MS-DOSおよびWindows3.x, 9x時代までのメモリマップ:

+--------------------------------+ 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掲載

メモリマップ中の用語解説(上のメモリマップで" * "付で解説した項目については解説省略)

Conventional Memory (コンベンショナル・メモリ)

8086/8088のアドレスバス20bitによる制限(1MB)および、IBM PC 5150を発祥とするIBM PC互換機のメモリ配置により、OSやユーザープログラムが利用可能な640KBのメモリ領域。ただし、アドレス0番地 - 3FFh番地までは割り込みベクタとして予約されているのに加え、搭載されている物理RAM容量の制限も加わり実際に利用可能な領域は640KBよりさらに少なくなる場合もある。
事実、IBM PC 5150の最小メモリモデルは16KBしか搭載されていない。640KB以上の領域にディスプレイやROM BIOSが配置されているのは、MMU(メモリ管理ユニット)など電子回路のレベルで調整されている。

Upper Memory Area (UMA)

640KB - 1MBの領域。正確にはアドレスバス20bitにおける、A0000h以上 - FFFFFh以下の領域。
ビデオアダプタやデバイスドライバなどのバッファ領域、およびFFFFFh近辺にはROM BIOSが配置されている。
アドレスの後ろ(高位)にROM BIOSが配置されるのは、x86系ではCPUのリセット後に最初に命令がフェッチされるアドレスがアドレスの最大値近辺に設定されている為である。(CS:F000h, IP:FFF0h, 物理アドレスはFFFF0hになり、80286以降は残りのアドレスバスもCPUリセット後は全てのbitが1になっている。)

384KBの全領域が隙間無く埋まっているわけではない。後述のEMSは、所々に空いている"穴"を使って実現している。

build-in memory

Compaqなど一部のOEM製品ではマザーボード上に1MBのRAMを搭載するようになった。その場合、640KBまではConventional Memoryとして使われるが残りの384KBを(電子回路レベルで)1MBより上の領域にずらすようになっていた。
というのは、UMA領域は既にROM BIOSや各種バッファ領域で使われていたからである。
HIMEM.SYSなどは、もし利用可能であれば extended memory block に含めるようになっていた。あるいは、extended memoryの最初の384KBとして使われるようになっていた。

Expanded Memory {Board|Page Frame}

初期のIBM PCおよびその互換機では、バンク切り替え機能を持つ専用メモリカードを拡張バスに接続し、メモリ増設に対処していた。
このメモリ領域は "Expanded Memory" と呼ばれ、このメモリ領域を管理するのが "Expanded Memory Manager"(EMM)である。
またその仕様をまとめ上げたのが "Expanded Memory Specification"(EMS) である。
EMSでは16KB単位でバンク切り替えを行い、これをページと呼んだ。4ページ=64KBを連続して割り当てた領域をページフレームと呼んだ。
各種操作はEMMにより隠蔽され、ユーザープログラムは気にする必要がない。サポートされるメモリ総量は32MB(=2048ページ)まで。

ページフレームは、Conventional Memory領域ではなく UMA領域に設定するのが殆どである。ただしその場合、ROM BIOSやビデオ・デバイスドライババッファ領域と衝突しないよう調整する必要があった。

High Memory Area (HMA)

後述する "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が搭載されている場合だけ利用可能となる。

eXtended Memory

物理RAMが1MB以上搭載されている場合で、なおかつ80286以上のCPUが搭載されている場合に利用出来る、1MB以降のメモリ空間。
この領域には、286以降のプロテクトモードを利用しないとアクセス出来ない。(プロテクトモードが提供するセグメントディスクリプタを用いたセグメント・オフセット指定を行う必要がある。)

IBM expanded memory adapter (XMA)

IBMによる独立したメモリアダプタと、ソフトウェアドライバによりアクセス出来るメモリ領域。EMSやXMSとは特に関わってこない。

MS-DOSおよびWindows3.1の時代までのメモリ管理およびその用語は、大きく二つのメモリ管理方式に分類される。

  1. 増設メモリカードによる "Expanded Memory" をバンク切り替え方式で活用する方式。
  2. 1MBを超えるRAM領域、"eXtended Memory" を活用する方式。

HMA, UMA, UMB, EMB, EMM, EMS, EMM386.{SYS|EXE}, QEMM, CEMM, XMS, HIMEM.SYS, LOADHIGH などの略語が多いが、上記二つの方式に分類し、歴史の流れを簡単に追っていく。

その前に、メモリ管理方式に影響を与えた二つの技術要素 "DOS extender" と "Terminate and Stay Resident"(TSR) について簡単にまとめ、予備知識としておく。

DOS extender (DOSエクステンダ)

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に収斂していく。その流れについては本記事では割愛する。

Terminate and Stay Resident (TSR)

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"コマンドであるといえる。

Expanded Memory (EMM, EMS, EMM386.SYS|EXE, QEMM, CEMM)

上でも説明したが、バンク切り替え機能を持つ専用メモリカードを拡張バスに接続して使う。

Expanded Memory Manager (EMM)
"Expanded Memory" を管理するソフトウェアのこと。
Expanded Memory Specification (EMS)
"Expanded Memory" を管理する為の仕様のこと。

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 までこのタイプがサポートされていたらしい。

EMM/EMSの簡単な歴史

1984年 -

専用メモリカードを使ったハードウェアタイプの"Expanded Memory"が登場。"Expanded Memory Manager"(EMM)も各社より発表される。それぞれ専用メモリカードも併せて発売された。

AST remm.sys
IBM ps2emm.sys
AT&T aemm.sys
Intel emm.sys
1987年 -

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 になり両方の内容が統合された。

1988
  • "Quarterdeck Expanded Memory Manager"(QEMM), Ver 4.2 がQuarterdeck Office Systemsによりリリース。80386が必要。
  • Windows/386(v2.1)でEMM386.SYSを提供開始。EMM386シリーズは80386の仮想86モードを使うのが特徴だった。
1989
MS-DOS 4.01 で EMM386.SYSを提供開始。
1990
Digital Researchの DR-DOS 5.0 でEMM386相当機能を提供開始。
1991
MS-DOS 5.0 で EMM386.EXEを提供開始。UMA中の未使用領域をマッピングし、デバイスドライバやTSRをUMAや上位アドレスに読み込む"load high"機能を提供した。"Upper Memory Block"の登場である。

ソフトウェアエミュレーションタイプは、紛れもなく 1MB を超える "eXtended Memory" を使う。従って、EMSは徐々にXMSに包含されていくようになる。

EMM386.SYS と EMM386.EXE の違い

EMM386.SYS
1988年のWindows/386 (v2.1x) で登場。MS-DOSで登場するのは1989年のMS-DOS 4.01から。仮想86モードを使うため80386以降のCPUが必要。
EMM386.EXE
1991年のMS-DOS 5.0で登場。後述の"Upper Memory Block"(UMB)の未使用領域にメモリをマッピング可能で、デバイスドライバやTSRをロードし、コンベンショナルメモリを節約する。

基本機能は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 (HMA, UMA, UMB, EMB, XMS)

"eXtended Memory"、通称XMS(eXtended Memory Specification)はMS-DOSで 1MB 以降のメモリを扱う為のメモリ管理方式の一つ。
MS-DOSが「公式に」対応したのはMS-DOS 5.0からだが、それ以前にも、サードパーティ製のフリーソフトでXMSに対応することができた。XMS自身の仕様としてはMS-DOS 3.0以上を動作対象としている。

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

High Memory Area (HMA)
前述の通り、100000h - 10FFEFh までの64KB弱の領域を使用する。
Extended Memory Block (EMB)
10FFF0h以降のメモリ領域を使用する。XMSでは、XMSドライバによりEMB領域の内容をコンベンショナルメモリの間でブロック転送できるようになっている。リアルモードのプログラムでも、XMSのファンクションコールを使うことで、一時的にプロテクトモードになってブロック転送を利用出来た。MicrosoftのKB37242によると、EMBに実行コードを格納することは出来ず、データストレージとしてのみ利用可能だったらしい。
Upper Memory Block (UMB)
BIOS, VideoRAMなどが使用するUpper Memory Area (UMA)中の空き領域を使用する。

規格のバージョンとしては、以下の3つがある。

バージョン1
HMAの規格だった。(発表年不明)
バージョン2
EMBとUMBが追加される。最大64MBのEMBを確保(allocate)出来る。(1988年, Microsoft, Lotus, Intel, AST 合同)
バージョン3
80386以降のCPUで最大4GBのEMB確保に対応。(1991年, Microsoft, Lotus, Intel, AST 合同)

WindowsやDOSがXMSのサポートを開始した流れは、大雑把に次のようになる。

  1. Windows/286(Windows 2.1x) : HIMEM.SYSによるHMA + EMB利用
  2. DR-DOS 5.0 : EMM386.EXE
  3. MS-DOS 5.0 : HIMEM.SYS + EMM386.EXE (UMB, EMS担当), 80386以降

※MS-DOS 5.0以前でも、サードパーティ製のフリーソフトでUMBを利用するタイプは存在した。
※この時代はとにかく、CONFIG.SYSやAUTOEXEC.BATを使ってUMBの空き領域の設定やEMM386のロードのオプションを調整する必要があった。

  • HIMEM.SYSはHMAを利用可能にすると共に、EMBも利用可能にした。乱暴に要約すれば、1MB越えのメモリ領域アクセスの為のデバイスドライバだった。
    • FreeDOSでは"HIMEM.EXE"という名前になっている。
  • DR-DOS 5.0, MS-DOS 5.0 での EMM386.EXEは、1MB超えのプロテクトモードのメモリを使ったソフトウェアエミュレーションタイプのEMMだった。

A20ライン

XMSでは1MBを超える物理メモリにアクセスする為、80286以降のCPUではA20ライン(A20ゲート)を有効化する必要があり、少なくともXMS2.0の段階でその機能は盛りこまれていた。

80286搭載のIBM PC ATが起源となる"A20ライン"(A20ゲート)については、 技術/歴史/"WindowsOS内部のアーキテクチャのすべて"読書メモ/4章 の "メモ:"A20ライン"" を参照。

HIMEM.SYSやEMM386.EXE、DOSをHMAにロードする為のCONFIG.SYSサンプル

まず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オプションを付ける。

参考資料

Wikipediaショートカット



プレーンテキスト形式でダウンロード
現在のバージョン : 4
更新者: msakamoto-sf
更新日: 2010-04-05 13:14:24
md5:cc64c9716b653d1ab2fde9648ceeb6a0
sha1:00cb702d7de0cbe8b35cb6389ad1d02ad4534e94
コメント
コメントを投稿するにはログインして下さい。