トップ-> アセンブラ 第2章-> 第2章.メモリー管理-> 2-6. メモリー管理

←前ページへ :  トップへ :  次ページへ→



2-6. メモリー管理

  ここではMS-DOSがどのようにメモリーを管理しているのかを解説します。

  まずコンベンショナルメモリーの下位には 割り込みベクターがあります。その次に、MS-DOS本体とデバイスドライバーが常駐し、 次にMS-DOSのCOMMAND.COMが常駐します。さらに、常駐プログラム(TSR)があり、空きメモリーと 続きます。

  MS-DOSはメモリーを「所有者」「大きさ」そしてMS-DOS Ver.5.0からは「名前」という 合計16バイトで管理しています。これをMCB(Memory Control Block)といいます。 MCBはOS内に「目次」のように一覧になっているのではなく、COMMAND.COMの常駐している 領域から、MCBに記録されている「大きさ」から次のMCBを探し、次のMCBを探し・・・と 最後まで続けているのです。

  1バイト 2バイト 2バイト 3バイト 8バイト
MCBの内容 識別子 所有者 大きさ ゴミ 名前
識別子が'M'の時は続きがある、'Z'の時はそのMCBで終了という意味
所有者が0の時は、空きメモリー。所有者がある場合は、そのプログラムのPSPのある セグメントアドレスが格納されている。

  一番最初のMCBを見つけるのは面倒なので、通常はCOMMAND.COMの常駐領域を調べて そこからMCBを追っていくという方法が採られています。COMMAND.COMの常駐領域には 「INT 2Eh」という割り込み先があります。したがって「INT 2Eh」の割り込みベクターを 調べて、そこからMCBを追います。割り込みベクターは以前解説したように、 0000:0000番地からあるのでそれを調べればわかるのですが、直接割り込みベクターを 書き換えたりしている最中に割り込みが入ったりすると、コンピュータが誤動作したりするので、 MS-DOSに依頼をして取得したり、書き換えたりします。それには「AH=25h(設定)」 「AH=35h(取得)」を使います


割り込みベクターの設定

	AH = 25h
	AL = 設定したい割り込み番号
	DS = 割り込み先のセグメントアドレス
	DX = 割り込み先のオフセットアドレス
	INT 21h

	戻り値:なし


割り込みベクターの取得 AH = 35h AL = 設定したい割り込み番号 INT 21h 戻り値:ES = 割り込み先のセグメントアドレス     BX = 割り込み先のオフセットアドレス

  これを用いて「INT 2Eh」の割り込み先=COMMAND.COMの常駐先を調べ、 そこから追います。例えば、COMMAND.COMの常駐先のセグメントが1001h番地ならば、 COMMAND.COM常駐領域のMCBのセグメントは1000h番地になります。

  1000h番地のMCBを調べ、大きさのところに「100h」と入っていたら、 次のMCBのセグメントアドレスは1101h番地になります。これを識別子が 'Z'になるまで続ければ、MCBを終えたことになります。UMBがリンクされていれば、 UMBまで追うこともできます。


←前ページへ :  トップへ :  次ページへ→