
DOSのメモリ管理において、拡張メモリとは、従来のメモリ(640 KiB)の制限を超えてDOSプログラムに追加のメモリを提供するバンク切り替えシステムのことです。
拡張メモリは、互換性のない複数の技術バリアントを包括する用語です。最も広く使用されたバリアントは、Lotus Development、Intel、およびMicrosoftが共同で開発した拡張メモリ仕様(EMS )で、この仕様は「 LIM EMS 」と呼ばれることもありました。LIM EMSには、3.0、3.2、および4.0の3つのバージョンがありました。最初に広く実装されたバージョンはEMS 3.2で、最大8 MiBの拡張メモリをサポートし、通常は周辺機器との通信(上位メモリ)に割り当てられるアドレス空間の一部を使用して、拡張メモリの一部をマッピングします。LIM EMS 3.xと競合する拡張メモリ管理標準であるEEMSは、 AST Research、Quadram、およびAshton-Tate (「AQA」)によって開発され、下位1 MiBの任意の領域をマッピングできました。EEMSは最終的にLIM EMS 4.0に組み込まれ、最大32 MiBの拡張メモリをサポートし、DOSマルチタスクも一部サポートしました。しかし、IBMはXMAと呼ばれる独自の拡張メモリ規格を開発した。
拡張メモリの使用は、1980年代後半から1990年代半ばにかけて、Lotus 1-2-3などのゲームやビジネスプログラムで一般的になったが、ユーザーがDOSからLinux、IBM OS/2、Microsoft Windowsなどのプロテクトモードのオペレーティングシステムに移行するにつれて、その使用は減少した。

IBM PCおよびIBM PC/XTの8088プロセッサは、1メガバイト(MiB、または 2 20バイト) のメモリをアドレス指定できます。この制限は、 Intel 8086の 20 ビット外部アドレスバス (および全体的なメモリ アドレス指定アーキテクチャ) から引き継がれています。PC の設計者は、下位 640 KiB ( 655 360バイトのアドレス空間は、従来型メモリと呼ばれる読み書き可能なプログラム メモリ (RAM) に使用され、残りの 384 KiB のメモリ空間は、システムBIOS 、ビデオ メモリ、拡張周辺機器ボード上のメモリなどの用途のために予約されています。
1984年に発表されたIBM PC ATは、拡張メモリとして最大16MiBのRAMをアドレス指定できる80286チップを使用しているが、これは保護モードでのみ可能である。保護モードに対応したソフトウェアが不足していたため(標準的なDOSアプリケーションは保護モードでは実行できない)、市場には別のソリューションが求められていた。[ 1 ]
より多くのメモリにアクセスできるようにするため、バンク切り替え方式が考案されました。この方式では、追加メモリのうち、一度にアクセスできるのは選択された部分のみです。当初は、ページフレーム と呼ばれる64 KiB(2¹⁶バイト)の単一のメモリウィンドウが使用されていましたが、後に柔軟性が向上しました。拡張メモリにアクセスするには、プログラムが特定の方法で記述されます。従来のメモリと拡張メモリの間のウィンドウを調整することで、拡張メモリ内の異なる場所にアクセスできます。
バンク切り替え技術を初めて試みたのは、Tall Tree Systems社がJRAMボードで行ったが[ 2 ]、普及しなかった[ 1 ](Tall Tree Systems社は後に同じJRAMブランドを使用したEMSベースのボードを製造した[ 3 ])。
Lotus Development、Intel、およびMicrosoftは協力してEMS規格(別名LIM EMS)を開発しました。最初に一般公開されたEMSバージョン3.0では、最大4MiB の拡張メモリへのアクセスが可能でした。バージョン3.2では、この容量が8MiBに増加しました。最終版であるEMSバージョン4.0では、拡張メモリの最大容量が32MiBに増加し、追加機能もサポートされています。
マイクロソフトは、バンク切り替えは洗練されていない一時的な措置ではあるが、必要な応急処置だと考えていた。ビル・ゲイツはインタビュー中にテーブルを拳で叩きつけ、拡張メモリについて「ゴミだ!間に合わせの代物だ!…だが、我々はそれを実行するつもりだ」と言った。両社は1985年春のCOMDEXでこの標準を発表する予定で、多くの拡張カード会社やソフトウェア会社が支持を表明した。[ 4 ] [ 5 ] AST Research、STB Systems、Persyst、Quadram、Tecmarは、IntelのAbove Board拡張カードに対抗するために、EMS準拠のカードを迅速に設計した。1985年半ばまでに、EMSを事実上の標準と呼ぶ人もいた。[ 3 ]
EMS 規格の最初の公開バージョンである EMS 3.0 は 1985 年にリリースされましたが、EMS 3.0 は EMS 3.2 に置き換えられるまで、ハードウェア実装はほとんどありませんでした。EMS 3.2 は、上位 384 KiB (上位メモリ領域) 内の 64 KiB 領域を 4 つの 16 KiB ページに分割して使用し、拡張メモリの一部をマッピングするために使用できます。[ 1 ]
Quadram、AST、およびAshton-Tateは Enhanced EMS (EEMS) 規格を作成しました。EMS 3.2 の上位互換である EEMS では、 下位 RAM の任意の 16 KiB 領域を拡張メモリにマッピングできます。ただし、割り込みやネットワークカード、ビデオカードなどの専用 I/O メモリに関連付けられていないことが条件です。そのため、プログラム全体を追加 RAM に切り替えたり、追加 RAM から切り替えたりできます。EEMS では、2 セットのマッピング レジスタのサポートも追加されました。これらの機能は、DESQviewなどの初期の DOS マルチタスク ソフトウェアで使用されています。1987 年の LIM EMS 4.0 仕様では、EEMS のほぼすべての機能が組み込まれています。[ 1 ]
LIM EMS 4.0 で追加された新機能は、EMS ボードが複数のページ マッピング レジスタ セット (最大 64 セット) を持つことができるようになったことです。これにより、DOS のマルチタスクの原始的な形式が可能になります。ただし、この規格ではボードが持つべきレジスタ セットの数が指定されていないため、この点に関してハードウェアの実装間で大きなばらつきがあります。[ 6 ]
拡張メモリ仕様(EMS)は、拡張メモリの使用方法を記述した仕様です。EMSの機能は、ソフトウェア割り込み67hを介してアクセスできます。EMSを使用するプログラムは、まずデバイス名EMMXXXX0のデバイスドライバをチェックして、インストールされている拡張メモリマネージャ(EMM)の存在を確認する必要があります。
IBMは、業界がLIM規格を広く採用する中、沈黙を保った。[ 3 ] PC Tech Journalは1986年2月に、「これはIBMにとって恥ずべきことだろう…IBMは約束を果たさなかった。Intelとそのパートナーは果たした」と書いた。[ 7 ]同社は独自のメモリ規格であるExpanded Memory Adapter(XMA)を開発した。IBM DOSドライバはXMAEM.SYSである。EMSとは異なり、IBM拡張ボードは拡張メモリモデルと拡張メモリの両方を使用してアドレス指定できる。[ 8 ]ただし、XMAボードで使用される拡張メモリハードウェアインターフェイスはEMSと互換性がないが、[ 9 ] XMA2EMS.SYSドライバはXMAボード用のEMSエミュレーションを提供する。[ 8 ] XMAボードは、1986年(改良版)の3270 PCモデルで初めて導入された。[ 9 ]

周辺アドレス空間にメモリウィンドウを挿入するには、当初はコンピュータのISA拡張バスに接続する専用の拡張ボードを使用する必要がありました。1980年代に有名だった拡張メモリボードには、 AST RAMpage、IBM PS/2 80286 Memory Expansion Option、AT&T Expanded Memory Adapter、Intel Above Boardなどがありました。当時のRAMの価格は1MiBあたり数百ドルにも達し、上記のブランドの品質と評判を考えると、拡張メモリボードは非常に高価でした。
その後、Intel 80286ベースのコンピュータの一部のマザーボードチップセット(特にNEATチップセット)は、アドオンボードを必要としない拡張メモリ方式を実装しました。通常、ソフトウェアスイッチによって、拡張メモリとして使用するメモリ量と、拡張メモリとして使用するメモリ量が決定されました。
拡張メモリボードはハードウェア周辺機器であるため、そのサービスを提供するソフトウェアデバイスドライバが必要でした。このようなデバイスドライバは拡張メモリマネージャと呼ばれていました。その名称は様々で、前述のボードではそれぞれ REMM.SYS (AST)、PS2EMM.SYS (IBM)、AEMM.SYS (AT&T)、EMM.SYS (Intel) が使用されていました。その後、この表現は、例えばQuarterdeckのQEMM、Qualitasの386 MAX 、 MS-DOS、PC DOS、DR-DOSのデフォルトのEMM386など、 Intel 80386プロセッサを必要とするソフトウェアのみのソリューションに関連付けられるようになりました。
1986年以降、Intel 80386プロセッサに内蔵されたメモリ管理機能は、従来のリアルモードソフトウェアを実行する際にアドレス空間を自由にモデル化できるため、ハードウェアによる解決策は不要となった。拡張メモリはソフトウェアでシミュレートすることが可能になった。
最初のソフトウェア拡張メモリ管理(エミュレーション)プログラムはCEMMで、1986年9月にCompaq Deskpro 386用のユーティリティとしてリリースされました。人気のある高機能な商用ソリューションとしては、Quarterdeck社のQEMMがありました。Qualitas社の386 MAXも競合製品でした。その後、1989年にMS-DOS 4.01に、1990年にはDR DOS 5.0にEMM386として機能が組み込まれました。
一般的に、ソフトウェア拡張メモリマネージャは、追加的ではあるものの密接に関連する機能を提供していた。特に、上位メモリ領域 (UMA)(リアルモードアドレス空間の上位384 KiB)の一部を上位メモリブロック(UMB)と呼ぶ機能を提供し、通常は終了して常駐する小さなプログラム(「LOADHI」または「LOADHIGH」)を内部にロードするためのツールを提供していた。
拡張メモリ、拡張メモリエミュレーション、およびDOSエクステンダー間の相互作用は、最終的にXMS、仮想制御プログラムインターフェース(VCPI)、DOSプロテクトモードインターフェース(DPMI)、およびDOSプロテクトモードサービス(DPMS)の仕様によって規制されることになった。
LIMulatorと呼ばれる一部のエミュレーションプログラムは、マザーボードや80386の機能に全く依存していませんでした。代わりに、 ベースRAMの64KiBを拡張メモリウィンドウ用に確保し、アプリケーションプログラムがページ切り替えを要求すると、拡張メモリまたはハードディスクとの間でデータをコピーしていました。これはプログラム的に実装するのは容易でしたが、パフォーマンスは低かったのです。この手法は、Above Software社のAboveDiskや、いくつかのシェアウェアプログラムで採用されていました。
また、EMM286(.SYSドライバ)などのサードパーティ製ユーティリティを使用して、286 CPU上でXMSメモリを使用することでEMSをエミュレートすることも可能です。
1990年代には拡張メモリの使用が減少しました。Linux、Windows 9x、Windows NT、OS/2、BSD/OSといった新しいオペレーティングシステムは、保護モードを標準でサポートしていました。こうした動きや同様の発展により、拡張メモリは時代遅れの概念となりました。
他のプラットフォームも同様の基本概念、つまりメインアドレス空間外の追加メモリを実装しているが、技術的に互換性のない方法で実装されている。