
DOSのメモリ管理において、拡張メモリとは、 IBM PCのアドレス空間の最初のメガバイト(2 20バイト)より上のメモリ、または80286以降のプロセッサと互換性のあるメモリを指します。この用語は主にDOSおよびWindowsオペレーティングシステムで使用されます。リアルモードまたは仮想x86モードで実行されるDOSプログラムは、このメモリに直接アクセスすることはできませんが、拡張メモリ仕様(XMS)と呼ばれるアプリケーションプログラミングインターフェイス(API)を介してアクセスできます。このAPIは、ドライバ( HIMEM.SYSなど)またはオペレーティングシステムカーネルによって実装され、プロセッサを一時的に保護モードに切り替えることで、メモリ管理と従来型メモリと拡張メモリ間のメモリコピーを処理します。この文脈では、「拡張メモリ」という用語は、拡張メモリ全体、またはこのAPIを介してアクセスできる部分のみを指す場合があります。
拡張メモリは、 VCPIまたはDPMIを使用して保護モードで実行されているDOSプログラムから直接アクセスすることもできます。これらは、DOSで保護モードを使用するための2つの(異なり、互換性のない)方法です。
拡張メモリは、バンク切り替えメモリモジュールを備えた拡張カードを使用して IBM PC のメモリ容量を 640 kB (655,360 バイト) 以上に拡張する以前の方法である拡張メモリ(EMS) と混同してはいけません。一般的なアプリケーションで拡張メモリがサポートされるようになったため、拡張メモリを使用して拡張メモリをエミュレートするデバイスドライバが開発されました。その後、リアルモードから 640 KB を超える追加メモリの小さな部分に直接アクセスできる 2 つの方法が開発されました。これらの 1 つは、拡張メモリの最初の約 64 KB で構成される高メモリ領域 (HMA) と呼ばれ、もう 1 つは、IBM PC がハードウェアアダプタと ROM 用に指定する 640 KB から 1 MB のアドレス範囲にある上位メモリ領域 (UMA、上位メモリブロックまたは UMB とも呼ばれる) です。
x86ベースの PCでは、拡張メモリはIBM PC ATなどのIntel 80286プロセッサ以上でのみ利用可能です。[ 1 ]これらのチップのみが 1 メガバイトを超えるRAMを直接アドレス指定できます。以前の8086 / 8088プロセッサでは、選択可能な部分を 1 MB 未満のアドレスに表示するための特別なハードウェアを使用すれば、1 MB を超える RAM を使用できます。
640kB以上のRAMを搭載した286以上のPCでは、IBM PCアーキテクチャがシステムROMと周辺機器用に640kBから1MBの間のアドレスを予約しているため、追加メモリは通常1MBの境界より上に再マッピングされます。
拡張メモリは、リアルモードではアクセスできません(ハイメモリ領域と呼ばれる小さな部分を除く)。拡張メモリを直接使用できるのは、プロテクトモードで実行されているアプリケーションのみです。Microsoft Windowsなどのプロテクトモードの監視オペレーティングシステムが、アプリケーションプログラムのメモリへのアクセスを管理します。プロセッサは、グローバル記述子テーブル(GDT) と 1 つ以上のローカル記述子テーブル(LDT) を介してこのメモリを利用可能にします。メモリは、ローカル記述子が割り当てられたメモリセグメントには別の LDT を使用するプログラムがアクセスできないという意味で「保護」されており、グローバル記述子が割り当てられたメモリセグメントにはアクセス権が制限され、違反するとプロセッサ例外(一般保護違反(GPF) など) が発生します。これにより、プロテクトモードで実行されているプログラムが互いのメモリに干渉するのを防ぎます。[ 2 ]
拡張メモリは、80286の保護モードではソフトウェアが動作しなかったため、当初は使用されませんでした。対照的に、業界はプロセッサに関係なくすべてのPCで動作する1985年の拡張メモリ規格をすぐに採用しました。 [ 1 ] Microsoft Windowsなどの保護モードオペレーティングシステムは、リアルモードプログラムも実行し、それらに拡張メモリを提供することができます。DOS保護モードインターフェイス(DPMI)は、マルチタスク環境でDOSプログラムが拡張メモリにアクセスするためのMicrosoftが規定した方法です。[ 2 ]
拡張メモリ仕様(XMS )は、 IBM PCの拡張メモリをリアルモードでデータ格納(ただし、実行可能コードの実行は除く)に使用する方法を規定した仕様です。メモリは、 HIMEM.SYSなどの拡張メモリマネージャ(XMM )ソフトウェアによって利用可能になります。XMM関数は、ソフトウェア割り込み2Fh関数4310hで取得できる変数アドレスへの直接呼び出しによってアクセスできます。
1988 年 7 月にリリースされた XMS バージョン 2.0 では、最大 64 MB のメモリが使用可能でした。[ 3 ] XMS バージョン 3.0 では、これが 4 GB (2 32バイト) に増加しました。[ 4 ]この違いは、合計および未割り当て (空き) 拡張メモリの量を 1 KB (1024 バイト) 単位で報告するために使用される値のサイズに直接起因しています。XMS 2.0 は 16 ビットの符号なし整数を使用しており、最大 (65535 * 1 KB) = 64 MB を表現できますが、XMS 3.0 では 32 ビットの符号なし整数を使用する新しい代替関数が追加され、(4 G * 1 KB) = 4 TB (4 テラバイト) を表現できますが、仕様により 4 GB に制限されています。[ 3 ] [ 4 ] (4 GB は、1991 年に XMS 3.0 が公開された時点で存在していた唯一の 32 ビット Intel x86 CPU である 80386 と 80486 のアドレス範囲です。) XMS 3.0 は、元の 64 MB の制限を持つ元の XMS 2.0 API 関数を保持していますが、4 GB の拡張メモリ (最初の 1 MB を除く) をサポートする新しい「スーパー拡張メモリ」関数を追加し、これらの「スーパー」関数は 32 ビット CPU レジスタを使用して値を渡すため、32 ビット CPU でのみ呼び出すことができます。[ 4 ]アプリケーションがどのバージョンの仕様に基づいて開発されたかによって、アプリケーションが利用できるメモリの量が異なる可能性があるため、後者をスーパー拡張メモリ( SXMS ) と呼ぶことがあります。
拡張メモリマネージャは、高位メモリ領域(HMA)および上位メモリ領域(UMA、上位メモリブロックまたはUMBとも呼ばれる)の割り当て管理も担当します。実際には、上位メモリ領域は拡張メモリマネージャ(EMM)によって提供され、その後、DOSがそれらをすべて割り当てて管理しようとします。