
DOSのメモリ管理において、従来型メモリ(ベースメモリとも呼ばれる)は、 IBM PCまたは互換システム上のメモリの最初の640キロバイトを指します。これは、オペレーティングシステムやアプリケーションプログラムが使用するためにプロセッサが直接アドレス指定できる読み書き可能なメモリです。メモリ価格が急速に下落するにつれて、この設計上の制約は、それを無関係にするオペレーティングシステムやプロセッサが登場するまで、大容量メモリの使用における制限となりました。
640KBの壁は、 IBM PC互換機のアーキテクチャ上の制約です。初代IBM PCで使用されていたIntel 8088 CPUは、20本のアドレス線を備えていたため、1MB(2²⁰バイト)のアドレス指定が可能でした。PCの設計において、 640KB以下のメモリはマザーボードまたは拡張ボード上のランダムアクセスメモリ(RAM)用であり、従来型メモリ領域と呼ばれていました。 従来のメモリ領域の最初のメモリセグメント(64 KB )は、下位メモリまたは低メモリ領域と呼ばれます。従来のメモリ領域を超えた残りの 384 KB は、上位メモリ領域(UMA)と呼ばれ、システム使用およびオプションデバイス用に予約されていました。UMA は、ROM BIOS、追加の読み取り専用メモリ、固定ディスクドライブおよびビデオアダプタ用の BIOS 拡張機能、ビデオアダプタメモリ、およびその他のメモリマップド入出力デバイスに使用されました。初代 IBM PC の設計では、カラーグラフィックスアダプタ(CGA)メモリマップは UMA に配置されていました。
RAMの需要は、予約済みアドレスを利用するハードウェアの需要よりも速いペースで増加したため、最終的にRAMは未使用の上位領域にマッピングされ、利用可能なアドレス空間すべてが活用されるようになった。これにより、ハードウェアが占有するアドレスセットに、任意のデータに使用できる予約済みの「穴」(または複数の穴)が生じた。このような穴を回避することは困難で、見栄えが悪く、DOSやDOS上で動作するほとんどのプログラムではサポートされていなかった。後に、これらの穴の間の領域は、上位メモリブロック(UMB)として使用されるようになった。
古いオペレーティングシステムやアプリケーションとの互換性を維持するため、 8086/8088 が保護モードで最大 16 MB のメモリをアドレス指定できるIntel 80286プロセッサに置き換えられた後も、640 KB の境界は PC 設計の一部として残されました。また、286 がリアル モードで動作している間は1 MB の境界も残されました。これは、DOS がセグメント レジスタとオフセット レジスタをオーバーラップして使用するリアル モードを要求し、20 ビットを超えるアドレスが不可能だったためです。これは、DOS で使用されるようなリアル モードを実行している場合、今日の IBM PC 互換機にもまだ存在します。最新の Intel PC でさえ、640 KB から 1024 KBの間の領域が予約されています。[ 3 ] [ 4 ]ただし、仮想メモリを使用する新しいオペレーティングシステム ( Windows、Linux、Mac OS Xなど) 上のプログラム (またはほとんどのオペレーティングシステム) からは見えません。これは、物理メモリ アドレスをまったく認識していないためです。代わりに、それらは利用可能な RAM アドレスとは独立して定義される仮想アドレス空間内で動作します。[ 5 ]
一部のマザーボードには、「15メガバイトのメモリホール」オプションが搭載されており、ビデオメモリ用に特定の1メガバイトへの排他的アクセスを必要とする特定のVGAビデオカードで必要となります。AGP(PCIメモリ空間)バスを使用する後期のビデオカードでは、1GBのアパーチャサイズ で256MBのメモリを搭載できます。
初期のIBM XTコンピュータで使用されていた手法の 1 つは、ビデオ メモリ アドレス範囲に追加の RAM をインストールし、制限をモノクロ ディスプレイ アダプタ(MDA) の開始位置まで引き上げるというものでした。この動作には、ソフトウェアまたはカスタムアドレス デコーダが必要な場合がありました。これにより、制限は 704 KB (MDA/HGC の場合) または 736 KB (CGA の場合) まで引き上げられました。[ 6 ] [ 7 ]
386 ベースのシステム上のメモリマネージャ( DR-DOSのQEMMや MEMMAX (+V)など) は、640 KB に従来型メモリを追加し、バリアを 704 KB (セグメント B000、MDA/HGC の開始まで) または 736 KB (セグメント B800、CGA の開始まで)に移動することで、同じ効果を実現できました。 [ 7 ]この状況では CGA しか使用できませんでした。拡張グラフィックスアダプタ(EGA) ビデオメモリが 640 KB ラインより下の従来型メモリ領域に隣接していたため、同じメモリ領域をビデオカードのフレームバッファと一時的なプログラムの両方に使用することはできませんでした。
All Computers のXT- [ 8 ] [ 9 ]および286/386SX- クラスのコンピュータ用のAllCard [ 10 ]というピギーバック式メモリ管理ユニット 、および MicroWayの ECM (Extended Conventional Memory) アドオンボード[ 11 ]により、通常のメモリを A0000–EFFFF ( 16進数) アドレス範囲にマッピングできるようになり、DOS プログラム用に最大 952 KBのメモリが確保されました。Lotus 1-2-3のようにビデオ メモリに直接アクセスするプログラムは、このメモリ レイアウトに対応するためにパッチを適用する必要がありました。そのため、ハードウェアの互換性を犠牲にして640 KB の制限が解消されました。 [ 10 ]
また、コンソールリダイレクト[ 12 ] ( COMMAND.COMを最初に起動するときにAUX:のような代替コンソールデバイスを指定するか、後でCTTYを使用することによって)を使用して、出力をダム端末またはターミナルエミュレータを実行している別のコンピュータに転送し、そこから入力を受け取ることも可能でした。システムBIOSがまだマシンの起動を許可していると仮定すると(少なくとも組み込みPCのBIOSではよくあることです)、いわゆるヘッドレスコンピュータのビデオカードを完全に削除することができ、システムはプログラムをロードするための連続したDOSメモリを合計960KB提供できました。
同様の使用法は、断片化されていないメモリレイアウトを持つ多くの DOS 互換コンピュータ(IBM 互換ではない)で可能でした。たとえば、8086 CPU カードCP - 200Bと最大 16 枚の SCP 110A メモリ カード (それぞれ 64 KB RAM を搭載) を備え、合計最大 1024 KB (ビデオ カードなし、コンソール リダイレクトを使用し、ブート / BIOS ROM をマッピングした後) を備えた SCP S-100 バス システム、 [ 13 ]最大 896 KB をサポートするVictor 9000 / Sirius 1、またはカスタムバージョンの MS-DOS で使用するためのより連続した DOS メモリを備えたApricot PCなどです。
DOS向けに作成された標準プログラムのほとんどは、必ずしも640KB 以上のメモリを必要としませんでした。代わりに、標準のDOSソフトウェアに加えて、常駐型プログラム(TSR)と呼ばれるドライバソフトウェアやユーティリティを使用することができました。これらのドライバやユーティリティは通常、一部の従来型メモリを永続的に使用するため、標準のDOSプログラムで使用できるメモリの総量は減少しました。
従来型のメモリを使用する非常に一般的なDOSドライバとTSRには、以下のようなものがあった。
上記のように、これらのドライバやTSRの多くは、システムのフル機能動作に実質的に不可欠であると考えられます。しかし多くの場合、コンピュータのユーザーは、特定の標準DOSプログラムを実行できるようにするか、お気に入りのドライバやTSRをすべてロードするかを選択する必要がありました。ユーザーが標準DOSプログラムも実行したい場合、上記のリスト全体をロードすることは、おそらく非現実的か不可能でしょう。
場合によっては、特定のプログラムを実行するためにドライバやTSRをメモリからアンロードし、プログラムの実行後に再度ロードする必要がありました。アンロードできないドライバについては、DOSの後のバージョンでは、コンピュータユーザーがメモリ使用量の多い特定の標準DOSプログラムを実行する前にロードするドライバやTSRのグループを選択できる起動メニュー機能が追加されました。
1980年代後半から1990年代初頭にかけて、DOSアプリケーションが大規模化・複雑化するにつれ、アプリケーションが利用できる従来型メモリを最大化するために、起動時にデバイスドライバやTSRプログラムを上位メモリ領域(UMA)の上位メモリブロック(UMB)に移動させることで、従来型メモリを解放することが一般的になった。この方法の利点は、ハードウェアの変更が不要で、アプリケーションの互換性が維持されることだった。
この機能は当初、 QEMMなどのサードパーティ製品によって提供されていましたが、1990年にDR DOS 5.0に、そして1991年にはMS-DOS 5.0に組み込まれました。ほとんどのユーザーはMS-DOS 5に付属のEMM386ドライバを使用していましたが、 QEMMなどのサードパーティ製品も人気がありました。
起動時、ドライバは「 DEVICEHIGH」ディレクティブを使用してハイレベルにロードでき、TSRは「 LOADHIGH」、「LH」、または「HILOAD」ディレクティブを使用してハイレベルにロードできました。操作が失敗した場合、ドライバまたはTSRは自動的に通常の従来型メモリにロードされました。
CONFIG.SYS、ANSI.SYSをUMBにロード、EMSサポートは無効:
デバイス=C:\DOS\HIMEM.SYS DEVICE=C:\DOS\EMM386.EXE NOEMS DEVICEHIGH=C:\DOS\ANSI.SYS
AUTOEXEC.BAT は、可能であれば MOUSE、DOSKEY、および SMARTDRV を UMB にロードします。
LH C:\DOS\MOUSE.EXE LH C:\DOS\DOSKEY.EXE LH C:\DOS\SMARTDRV.EXE
DOSバージョン5.0以降では、DOSの=HIGHコマンドを使用してシステムコアコードを高位メモリ領域(HMA)に移動できるようになったことで、空きメモリ容量がさらに増加した。
ハードウェア拡張ボードは、 ROMのアドレス指定に上位メモリ領域の任意の場所を使用できたため、上位メモリブロックのサイズと位置は、搭載されているハードウェアに応じてコンピュータごとに異なっていた。上位メモリの領域には、大きいものもあれば小さいものもあった。ドライバやTSRを上位にロードすると、ブロックが選択され、プログラムが収まるブロックが見つかるまで、そのブロックにプログラムが収まるように試行された。見つからない場合は、通常のメモリ領域に書き込まれた。
ドライバとTSRの特異な点は、ロードされる順序に基づいて、従来型メモリや上位メモリの使用量が異なることです。これは、プログラムが異なる順序で繰り返しロードされ、各順列の後にどれだけのメモリが空いているかを確認する場合に有利に利用できます。たとえば、50KBの UMBと10KBの UMBがあり、 8KBと 45KBを必要とするプログラムがロードされた場合、8KBは50KBのUMB に割り当てられ 、2番目のプログラムのロードが妨げられる可能性があります。DOSの後のバージョンでは、ドライバまたはTSRに特定のロードアドレスを使用することで、ドライバ/TSRをより密接に配置できるようになりました。
MS-DOS 6.0では、MicrosoftはMEMMAKERブロックマッチングのプロセスを自動化する機能を導入し、サードパーティ製のメモリマネージャが提供する機能と同等の機能を実現しました。しかし、この自動最適化によっても、従来のメモリ領域を最大限に活用するという点では、手動で行う場合と同じ結果が得られないことがよくありました。
また、場合によっては、サードパーティ企業が、複数の標準DOSドライバやTSRの機能を、わずか数キロバイトのメモリしか使用しない非常にコンパクトな単一のプログラムに統合した、特別な多機能ドライバを作成しました。例えば、マウスドライバ、CD-ROMドライバ、ANSIサポート、DOSKEYコマンドの呼び出し、ディスクキャッシュなどの機能がすべて1つのプログラムに統合され、通常のドライバ/割り込みアクセスには1~2キロバイトの従来型メモリしか消費せず、残りの多機能プログラムコードはEMSまたはXMSメモリに格納されます。
この障壁は、DOS アプリケーションを 16 ビットまたは 32 ビットの保護モードで実行できるDOS エクステンダーの登場によってようやく克服されましたが、これらはコンピュータ ゲーム以外ではあまり広く使用されませんでした。32 ビット DOS エクステンダーを使用すると、ゲームは 66h/67h オペランド/アドレス オーバーライド プレフィックスなしで 32 ビットのフラット アドレス空間と完全な 32 ビット命令セットの恩恵を受けることができました。32 ビット DOS エクステンダーにはコンパイラ サポート (32 ビット コンパイラ) が必要でしたが、XMSとEMS は16 ビット リアル モード DOS アプリケーションを対象とした古いコンパイラで動作しました。DOS エクステンダーの最も一般的な 2 つの仕様は、 VCPI、そして後にWindows 3.x と互換性のあるDPMIでした。
DPMI準拠のDOSエクステンダーの中で最も有名なのは、 Watcomに同梱されていたDOS/4GWでしょう。これはDOS用ゲームで非常によく使われていました。このようなゲームは、DOS/4GWの32ビットカーネル、またはパス内もしくは同じディレクトリにあるDOS/4GWカーネルをロードするスタブと32ビットの「リニア実行ファイル」で構成されていました。このようなプログラムからDOS/4GWを取り除き、ユーザーが複数の、そしておそらく改良されたDOS/4GWクローンを試せるようにするユーティリティも存在します。
DOSエクステンダーが登場する以前は、ユーザーがメモリを追加インストールし、それをDOS上で使用したい場合、まず拡張メモリ仕様(EMS)または拡張メモリ仕様(XMS)のいずれかをサポートするドライバをインストールして構成し、これらの仕様のいずれかをサポートするプログラムを実行する必要がありました。
EMSは、 Intel 8086およびIntel 8088ベースのPCを含むすべてのPCで利用可能な仕様であり、アドオンハードウェアが「リアルモード」アドレス空間(0x0400~0xFFFF)から小さなメモリチャンクをページイン/ページアウト(バンク切り替え)できるようにしました。これにより、16ビットのリアルモードDOSプログラムは、通常(0xE000~0xEFFF)のリアルメモリの穴を通して、数メガバイトのRAMにアクセスできました。プログラムは、ページを使用する前に、アクセスするページを明示的に要求する必要がありました。これらのメモリ位置は、別のページに置き換えられるまで、任意に使用できました。これは、現代のページング仮想メモリと非常によく似ています。ただし、仮想メモリシステムでは、オペレーティングシステムがすべてのページング操作を処理しますが、EMSではページングは明示的でした。
XMS は、16 ビット DOS プログラムが低位メモリ (アドレス 0x0400~0xFFFF) に 80286 または 80386 拡張メモリのチャンクをロードできるようにする基本プロトコルを提供しました。一般的な XMS ドライバは、このメモリをロードするために保護モードに切り替える必要がありました。このアプローチの問題点は、286 保護モード中は直接 DOS 呼び出しができないことでした。回避策は、286 のリセットを必要とするコールバック メカニズムを実装することでした。286 では、これは大きな問題でした。「仮想 8086 モード」を導入したIntel 80386では、ゲスト カーネルが 8086 をエミュレートし、プロセッサを実際に「リアル モード」に戻すことなくホスト オペレーティングシステムを実行できるようになりました。HIMEM.SYS 2.03以降は80386以降のCPUでアンリアルモードを使用していたが、HIMEM.SYS 2.06以降はLOADALLを使用して80286の非公開の内部レジスタを変更し、リアルモード/プロテクトモードの繰り返し切り替えを回避することで割り込みレイテンシを大幅に改善した。[ 14 ]
Windows は、 DOS 3.3 以降に独自のバージョンの HIMEM.SYS [ 15 ] をインストールします。Windows HIMEM.SYS は、Windows 仮想マシンマネージャ用の 32 ビット保護モード XMS (n).0 サービスプロバイダを起動し、DOS ボックスと 16 ビット Windows マシンに XMS (n-1).0 サービスを提供します (たとえば、DOS 7 HIMEM.SYS は XMS 3.0 ですが、 Windows 95 DOS ウィンドウ で 'MEM' コマンドを実行すると、 XMS 2.0 の情報が表示されます)。
ページ 9F000 からページ 100000 までのメモリ アドレス範囲にギャップがあることに注目してください...
IBM は
、私が 8086 CPU [カード] の設計で特に避けていたメモリ制限を再び導入しました。S
-100 コンピュータ
の場合、通常のコンピュータ端末を使用する低コストの代替手段として、ビデオ カードを使用する方法がありました。しかし、ビデオ カードはメモリ アドレス空間の一部を使用します。ブート ROM も通常はアドレス空間を使用します。SCP システムは端末で使用するように設計されており、ブート ROM は起動後に無効にできます。これにより、1 MB のメモリ アドレス空間全体が RAM に使用できるようになります。一方、IBM は、ビデオとブート/BIOS ROM のために、
PC
のアドレス空間を
640
KB の RAM に制限していました。この制限は「DOS 640Kの壁」と呼ばれていますが、
DOS
とは何の関係もありませんでした。
マイクロソフトは
SCP
システムの機能を最大限に活用しました
。SCPがサービスを停止してから数年後の1988年になっても、彼らはSCPシステムでしか実行できないタスク(「リンカーのリンク」)のために、依然としてSCPシステムを使用していました。彼らのマシンには、
64KBのカードを16枚使用し、合計1MBのRAMが搭載されていました。このマシンは、
Intel
の
386
マイクロプロセッサ用の32ビットソフトウェアツールが開発されるまで、廃棄することができませんでした
。