
DOS メモリ管理では、ハイ メモリ領域( HMA ) は、IBM ATまたは互換機 の1メガバイトを超える最初の 65520バイトで構成されるRAM領域です。
リアルモードでは、Intel 8086以降のプロセッサのセグメンテーション・アーキテクチャは、16ビットのセグメントと16ビットのオフセットでメモリ位置を識別し、(セグメント) × 16 + (オフセット) によって物理アドレスに変換されます。1 メガバイト(MB) (2 20バイト)のメモリのみをアドレス指定することを目的としていますが、セグメント:オフセットは1MBを超えるメモリを参照します( )。そのため、80286以降のプロセッサでは、このモードは実際には1MBマークの16バイト前から始まる64KBの範囲の一部として、拡張メモリの最初の65520バイトをアドレス指定できます( )。1MBのメモリと20本の アドレスラインしかないIntel 8086および8088プロセッサでは、 20番目のビットで折り返されたため、そのアドレスはと同等でした。[1] FFFF:0010FFFF0 + 0010 = 100000FFFF:0000 (0xFFFF0)FFFF:FFFF (0x10FFEF)FFFF:00100000:0000
IBMは、新しいIBM PC ATコンピュータ上でこの機能を利用して低位メモリにアクセスしていた既存のDOSプログラムを実行できるようにするために、マザーボードに特別な回路を追加し、ラップアラウンドをシミュレートしました。この回路は、マイクロプロセッサの21番目のアドレスラインであるA20をマザーボードの他の部分から切り離す単純な論理ゲートでした。このゲートは、当初はキーボードコントローラを介して制御され、RAM全体にアクセスするプログラムを実行できました。[1]
いわゆるA20ハンドラはアドレッシングモードを動的に制御することができ、[1]これによりプログラムは1024〜1088KBの領域に自身をロードし、リアルモードで実行することができる。[1]
HMAで実行するのに適したコードは、位置に依存しないようにコーディングされているか(相対参照のみを使用)、 HMA内の特定のアドレスで動作するようにコンパイルされているか(通常、1つまたは最大2つのコードのみがHMAを共有できる)、段落境界またはオフセット再配置可能(ロード中にすべてのアドレスが固定される)に設計されている必要があります。[2] [1]
HMA 内のコード (またはデータ) がCPUによってアドレス指定される前に、対応するドライバは HMA がマップされていることを確認する必要があります。そのためには、そのような要求がHMA 外部のメモリに残っているスタブを介してトンネリングされ、A20 ハンドラが呼び出されて (一時的に) A20 ゲートが有効になります。[2] [1]ドライバがパブリック データ構造を示さず、基礎となるオペレーティング システムによって既に制御されている割り込みまたは呼び出しのみを使用する場合、システムが A20 を処理するようにドライバをシステムに登録して、別のスタブの必要性を排除できる可能性があります。[1] [nb 1]
Microsoft製品の中でHMAが最初に使用されたのは1988年のWindows/286 2.1で、HIMEM.SYSデバイスドライバが導入された。1990年にDigital ResearchのDR-DOS 5.0 [3] ( [4]およびCONFIG.SYS経由)から、また1991年以降はMS-DOS 5.0 [3] (経由)から、オペレーティングシステムのBIOSとカーネルの一部もHMAにロードできるようになり、[3] [5]最大46KBのコンベンショナルメモリが解放された。[1]デバイスドライバや常駐プログラム(TSR)などの他のコンポーネントは少なくとも上位メモリ領域(UMA)にロードできたが、HMAにはロードできなかった。DOS 5.0以降では、とともに、システムはさらにディスクバッファをHMAに移動しようとした。[5] DR DOS 6.0 (1991)以降では、ディスク バッファ ( 、および後に 経由)、コマンド プロセッサCOMMAND.COMの一部、およびKEYB、NLSFUNC、SHAREなどのいくつかの特別な自己再配置ドライバも (それぞれのオプションを使用して) HMA にロードできるため、従来の DOS ソフトウェアが動作するために、さらに多くのコンベンショナル メモリと上位メモリが解放されました。[1] TASKMAX も、自身の一部を HMA に再配置したようです。[6] [7] NovellのNetWare LiteのNLCACHEと、 Personal NetWareおよびNovell DOS 7のNWCACHEの初期バージョンも HMA を利用できました。[8] [9] [7] MS-DOS/PC DOS では、COMMAND.COM の約 2 KB の共有部分と、準備されたコード ページ用の DISPLAY.SYS ビットマップをHMA に再配置できます。[10 [10] [11] MS-DOS 6.2 (1993)以降では、 DBLSPACE.BIN / DRVSPACE.BINの約5KBの部分がHMA内でDOSと共存できる(DBLSPACE / DRVSPACEが呼び出されない限り)。[5] [12] PC DOS 7.0(1995)および2000では、DOSKEYがHMA(利用可能な場合)にロードされる。[13]HIDOS.SYS /BDOS=FFFF HIDOS=ONDOS=HIGHDOS=HIGHHIBUFFERSBUFFERSHIGH/MH /NOHMASHAREもHMAにロードできる(/NOHMAオプションが指定されていない場合)。[13] MS-DOS 7.0(1995年)から8.0 (2000年)では、HMAの一部は、ロードされたリアルモードドライバのさまざまなプロパティを記録する、成長するデータ構造を保持するためのスクラッチパッドとしても使用されている。[7] [14] [15]
[…] 機能追加を促す最も重要な要因の一つは
、1990年春に初めて知った
DRDOS 5.0からの競争圧力でした。DRDOSの機能セットにより、
UMB
サポート、タスクスワップ、Undelete機能が追加されました。 […] チームマネジメントの注意力は、ファイル転送ソフトウェア、Undelete機能、ネットワークインストールといった新機能に大きく傾きました。 […] 最終的に、この状況は1990年7月末に危機的な状況に陥り、
BradS
の指揮の下、チームマネジメントはプロジェクト終了のスケジュールとプロセスを確定するために、一連の困難な会議を重ねました。 […]
(1+32ページ)
[…]
MS-DOS 7.0
以降では、INT 21h/AX=4A03hとINT 21h/AX=4A04hが追加されました。
RBIL
61 INT 21h/AH=52h には、MS-DOS 7.0+ HMA MCB チェーンに関する情報がいくつか含まれています […] TSR の HMA 再配置は
DR-DOS
にとって非常に意味があります。BIOS
と
BDOS 、
シェル
の常駐部分、
BUFFERS 、および
SHARE
、
KEYB
、
NLSFUNC
などの DR-DOS TSR (および一部の問題では TASKMGR と
NWCACHE
の一部
) の大部分を HMA にロードできますが、通常は約 10 KB (サードパーティのシェルを使用する場合は最大約 20 KB) の空き領域がまだあります。これは
MS-DOS 5.0
-
6.22
および
2000
までの
PC DOS
でも当てはまります
。これらのバージョンでは通常、HMA メモリの 4 - 7 KB が未使用のままになります (SHARE、KEYB、NLSFUNC は HMA にロードできませんが、
DBLSPACE
と
HIMEM は
ある程度ロードできます)。この問題により、通常は HMA に配置される新しい (そして大部分は文書化されていない) RMD データ構造が導入されたため、
MS-DOS 7.0
以降では使用可能な HMA スペースがかなり不足する可能性があります。カーネルはブート時に構成とリアル モード ドライバのデータ (ドライバのタイプ、ドライバによってフックされた割り込み、
CONFIG.SYS
の呼び出し行など) を収集して記録し、この情報を […] 複雑で […] 増大し続けるデータ構造に格納します。おそらくこの情報は、Windows コアが、DOS をモノリシック ブロックとして扱う代わりに、ロードされたリアル モード ドライバーの状況をより正確に把握するために、あるいは […] ドライバーの一部をアンフックまたはアンロードするために使われるものと思われますが、この情報の使用範囲は非常に限定されており (たとえば、Windows 9x の起動時に作成されるログ ファイルに反映されている情報の一部を確認でき、Windows 構成マネージャーの一部もこの情報を使用しています)、技術的な側面以外にもさまざまな憶測の余地が残されています。特に、興味深い情報が文書化されていないためです… […]
NWDOSTIP.TXTに関する包括的な著作であり、多くの未文書化の機能と内部構造の説明が含まれています。これは著者が2001年まで維持し、当時多くのサイトで配布していた大規模なコレクションの一部です。提供されているリンクは、HTMLに変換された古いバージョンのファイルを指しています。)[4]MPDOSTIP.ZIP
例えば
PC DOS 7
/
2000
)の一部のバージョンでは、現在使用されていないフォントが
XMSメモリ
に保存されます。MS-DOS/PC DOSのDISPLAY.SYSの初期のバージョンには、それらをHMAメモリに保存する機能があったようです[…]
[…]
DOSKEY.COM
[…] コードをHMA(Human Access Memory Access)に移動可能であれば移動します。[…]
SHARE.EXE
[…] コードをHMA(Human Access Memory Access)に移動し、/NOHMAオプションを追加して強制的に低速で読み込みます。[…]
、MS-DOS 7
(Windows 9xのみ)ではHMAにロードできません
。これは、利用可能な未使用のHMAメモリが不足しているためと思われます。[…]
[…] 86-DOS、そしてPC DOS / MS-DOSは巧妙なトリックを使用していました。PSPのオフセット5のバイトには、ファーコールオペコード(9Ah)が含まれていました。PSPのオフセット6のワードには、プログラムセグメントサイズを示す適切な値と、ファーコールのオフセット部分が含まれていました。ファーコールのセグメント部分として機能するオフセット8のワードは、オフセットと組み合わせるとラップアラウンド(8086 CPUのよく知られた機能)し、割り込みベクター30hを含むアドレス0:C0hを指すように作られていました[…] CALL 5インターフェースはWindows NTおよびOS/2のDOSエミュレーションでも動作しますが、これらのシステムはA20ラインを無効にした状態では動作しません。では、どのように動作するのでしょうか? […] アドレスビットを切り捨てるのではなく、システムは0:C0hの5バイトを1000C0hにミラーリングします。実際、同じ手法はDOS 5以降で使用されていましたDOS=HIGH。その場合、DOSはリニアアドレス1000C0hに適切なファーコールが含まれていることを確認します。 […]
壊れたポインター
の場合[…] 数年前、Axelと私は、複数の割り込みベクターに対してドライバーへの1つのエントリポイントを使用する方法を検討していました(これにより、複数のエントリポイントと、それらすべてでほぼ同じ起動/終了フレーミングコードのためのスペースを大幅に節約できるため)。そして、内部で異なる割り込みハンドラーに切り替えるのです。例えば、1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] はすべて全く同じエントリポイントを指しています。INT 21h を 1234h:0000h に、INT 2Fh を 1233h:0010h にフックするなどすると、すべて同じ「抜け穴」を通りますが、それでもそれらを区別し、内部的に異なるハンドラに分岐することができます。HMA ロード用のA20スタブへの「圧縮」エントリポイントを想像してみてください。これは、プログラムがセグメント:オフセットマジックを実行しない限り機能します。[…] これに対し、複数のエントリポイントを持つ( IBMの割り込み共有プロトコルをサポートする場合もある)という逆のアプローチと比較してみましょう。この方法では、多くの割り込みをフックすると、はるかに多くのメモリを消費します。 […] 他のドライバーが何らかの理由でポインターを正規化または非正規化するかどうかは分からないため、実際にはこの方法はおそらく安全ではないという結論に達しました。[…]