ここでは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まで追うこともできます。