この記事には複数の問題があります。改善にご協力いただくか、トークページでこれらの問題について議論してください。(これらのメッセージを削除する方法とタイミングについてはこちらをご覧ください)
|

DOS メモリ管理では、ハイ メモリ領域( HMA ) は、IBM ATまたは互換機 の1メガバイトを超える最初の 65520バイトで構成されるRAM領域です。
リアルモードでは、Intel 8086および後続のプロセッサのセグメンテーションアーキテクチャは、 16 ビットのセグメントと 16 ビットのオフセットでメモリ位置を識別し、(セグメント) × 16 + (オフセット) によって物理アドレスに解決されます。 1 メガバイト(MB) (2 20バイト) のメモリのみをアドレス指定することを意図していますが、セグメント:オフセット のアドレス指定は1 MB を超えるメモリを参照します ( )。 そのため、80286および後続のプロセッサでは、このモードは実際には 1 MB マークの 16 バイト前から始まる 64 KB 範囲の一部として、拡張メモリの最初の 65520 バイト (から )をアドレス指定できます。 1 MB のメモリと 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 ]
マイクロソフト製品の中で 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 ]最大 46 KB のコンベンショナル メモリが解放されました。[ 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 では、約 1.5 TB のRAMが HMA にロードされました。 COMMAND.COMの2KBの共有部分はHMAに再配置することができ、[ 10 ] 、準備されたコードページ用のDISPLAY.SYSビットマップも同様に再配置することができる。[ 10 ] [ 11 ] MS-DOS 6.2 (1993)以降では、 DBLSPACE.BINの約5KBの部分がHMAに再配置することができる。HIDOS.SYS /BDOS=FFFFHIDOS=ONDOS=HIGHDOS=HIGHHIBUFFERSBUFFERSHIGH/MH/DRVSPACE.BINは、HMA 内で DOS と共存できます ( DBLSPACE / DRVSPACE/NOHMAが呼び出されない限り)。[ 5 ] [ 12 ] PC DOS 7.0 (1995) および2000では、DOSKEY はHMA にロードされます (使用可能な場合)、[ 13 ]また、SHARE も 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)に移動可能であれば移動します。[…]
SHARE.EXE
[…] コードをHMA(Human Access Memory)に移動し、/NOHMAオプションを追加して強制的に低速で読み込みます。[…]
、MS-DOS 7
(Windows 9xのみ)ではHMAにロードできません
。これは、利用可能な未使用のHMAメモリが不足しているためと思われます。[…]
アーカイブ。2020年2月19日閲覧。 [
…] 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はリニアアドレス1000C0hに適切なファーコールが含まれていることを確認します。 […]DOS=HIGH
壊れたポインタ
の場合[…] 数年前、Axelと私は、複数の割り込みベクターに対してドライバーへの1つのエントリポイントを使用する方法を検討していました(これにより、複数のエントリポイントと、それらすべてでほぼ同じ起動/終了フレーミングコードのためのスペースを大幅に節約できるため)。そして、内部で異なる割り込みハンドラーに切り替えるのです。例えば、1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] はすべて全く同じエントリポイントを指しています。INT 21h を 1234h:0000h に、INT 2Fh を 1233h:0010h にフックするなどすると、すべて同じ「抜け穴」を通りますが、それでもそれらを区別し、内部的に異なるハンドラに分岐することができます。HMA ロード用のA20スタブへの「圧縮」エントリポイントを想像してみてください。これは、プログラムがセグメント:オフセットマジックを実行しない限り機能します。[…] これに対し、複数のエントリポイントを持つ( IBMの割り込み共有プロトコルをサポートする場合もある)という逆のアプローチと比較してみましょう。この方法では、多くの割り込みをフックすると、はるかに多くのメモリを消費します。 […] 他のドライバーが何らかの理由でポインターを正規化または非正規化するかどうかは分からないため、実際にはこの方法はおそらく安全ではないという結論に達しました。[…]