Upper Memory Area
![](http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/PC_DOS_memory_map_ja.svg/171px-PC_DOS_memory_map_ja.svg.png)
Upper Memory Area (アッパー メモリ エリア、UMA、上位メモリ領域) は、IBM PC互換のx86コンピュータの設計上の特徴であり、コンベンショナルメモリに640KBの上限があることの原因である。Upper Memory Block (UMB) はUMA領域内にRAMを割り当てたブロックを指す。
予約されたメモリ空間
IBMはPCのメモリマップ上の高位アドレス領域をROM、周辺機器内のRAM、メモリマップされた入出力 (I/O) に予約した。この領域をUMAと呼び、コンベンショナルメモリより高位のアドレスである640KB[1]と最初のPCの8088CPUのアドレスの上限である1MB[1]の間に置いた。例えば、モノクロビデオメモリ領域は0xB0000から0xB7FFF (704 - 736 KB) である。しかし、VRAMやBIOSのROMやI/Oポートなどを配置したとしても、この384KBの領域のほとんどは使われていなかった。EMSでのバンク切り換え用に64KBのページフレームを確保したとしても、やはり大部分は空いていた。
DR-DOS での利用
DOSにおける次の革新は、DOS自身がUMBと High Memory Area (HMA) を扱うようになったことである。これを最初に実現したのは1990年にリリースとなったDR-DOS 5.0だった。DR-DOSのメモリマネージャ EMM386.EXE はQEMMや他の互換プログラムとほぼ同等の機能を有していた。
DR-DOSが従来のDOSとQEMMなどとの組み合わせよりも優れていた点は、DR-DOSのカーネル自身とそのデータ構造のほとんどを高位メモリにロードできる点と、関連コンポーネントを全てUMBにロードできる点だった。これによってベースメモリがほぼ全て空き、設定によっては640KBのうち620KBがアプリケーションで利用可能となった。
設定は自動的ではない。UMBの空き領域は人間が把握する必要があり、その結果をCONFIG.SYS内のEMM386をロードする行に記述する必要がある。また、ドライバのUMBへのロードもCONFIG.SYSやAUTOEXEC.BATに記述する必要がある。これは簡単な作業ではない。QEMMではそのような作業の大部分を自動化していたため、QEMMも市場で生き残った。実際、QEMM は DR-DOS とも共存でき、PC用ユーティリティとしては最も売れた製品の1つとなった。
MS-DOS での利用
DR-DOSの機能はマイクロソフトが真似をして、1991年6月にMS-DOS 5.0をリリースした。結局、さらにDOSのデータ構造をコンベンショナルメモリから追い出すことに成功し、640KBのうち631KBが空くようになった。MS-DOS 6.0からはmemmakerというプログラムが追加され、TSRを高位メモリに追い出すことで自動的にコンベンショナルメモリを最適化できるようになった。
1990年代初期にはアプリケーションが巨大化してきたため、それを複雑な構成のPC上で動作させるためのDOSのメモリマップ最適化は非常に重要なスキルとなっていた。まずUMBを最大限多く用意するため、不要なメモリブロック(カラーディスプレイのマシンでのモノクロビデオメモリ領域など)のマッピングを変更する。そして、DOSの多数のサブコンポーネントを正しい順序でUMBにロードしてメモリブロックをなるべく効率的に使用できるようにし、ロードの最中だけ必要とされるTSRプログラムが使うメモリを考慮する(ロード完了後、TSRの使っていたメモリは解放される)。幸いモジュール間の依存関係はそれほど複雑ではなく、多くの場合はどういう順序でロードしても大丈夫だった。例外としては、CD-ROM をキャッシュするにはたいていのディスクのキャッシュをCD-ROMドライバの後からロードする必要があり、ネットワーク系のモジュールはOSI参照モデルの階層の順序に従ってロードする必要があった。
簡単だが効果的な最適化手法として、HIMEM.SYS をデバイスとしてロードし、その後にEMM386.EXEをデバイスとして "RAM AUTO" オプション付きでロードするという手法がある。それによってデバイスドライバが自動的にUMAにロードされる。この手法は基本メモリマネージャを効率的にコンベンショナルメモリにロードし、それ以外をすべてUMAにロードするというものである。MSCDEXのようにコンベンショナルメモリを大量に消費するプログラムも同様の手法でUMAにロードでき、それによってコンベンショナルメモリを大きく解放することができた。
マルチタスクでの利用
QuarterdeckのDESQviewといったDOSをマルチタスク化するソフトウェアでは、複数のアプリケーションを同時に実行でき、それぞれが600KB弱のメモリを利用しつつ、DOSの機能やドライバにアクセスできるようになっていた。
Windows での利用
Windows 3.0 / 3.1が普及してくると、Upper Memory Areaの重要性は低下してきた。これはWindowsアプリケーションがDOSのメモリ制限に制約を受けないためだったが、Windows上で動作するDOSプログラムには依然として制限がつきまとった。Windows 95がリリースされるとさらに重要性は低下していった。というのも、DOSのデバイスドライバがDOSアプリケーションに提供していた機能の多く(CD、ネットワーク、サウンドなど)をWindowsが提供できるようになったためである。Windows 95 のDOSボックスは自動的に最適化されるようになった。しかし、この環境では全てのDOSプログラムが動作できるわけではない。特にリアルモードからプロテクトモードに切り替えようとするプログラムは動作できない(仮想86モードの仕様)。この点は現在ではIntel VTやAMD-V (Pacifica) といったx86仮想化技術で解決されている。またWindows 95では、VCPI APIを使ってモードを切り替えようとするプログラムは動作せず、DPMI APIを使った切り替えのみがサポートされていた。
脚注
- ^ a b RAMなどのメモリは一般に2進接頭辞を使ってサイズを表す。したがってKは10001ではなく10241、Mは10002 ではなく10242、Gは10003 ではなく10243などとなっている。