Windows 2000のインストールで上書きされたDOSのブートセクターをどう復旧しようか考えていたら気になってしまい、調べていた。こういう解析が趣味になってきているな。

マスター ハードディスク ブート レコード (MBR、Master hard disk Boot Record)

IBM DOS K3.3以降

IBM DOS K3.3以降、PC DOS 2000までMBRのブートコードは全く変わっていない。MS-DOSも同一のコードを使用している。

区画(パーティション)テーブルには各区画のアドレスがCHSパラメーターで記録されている。MBRはアクティブフラグがある区画からCHSパラメーターを拾い、BIOS INT13hで区画ブートレコードをロードする。

AT ROM BIOSとIDEハードディスクの仕様により、IDEハードディスクは504MB(C:H:S = 1024:16:63)までしか使えないという制限がある。SCSIハードディスクはこの制限を受けない。公称ではこの通りだが、実際には1994年頃のBIOSよりCHSパラメーターを変換する機能が追加されたことで、約8GB(C:H:S = 1024:256:63)まで使える場合がある。ただし、FAT16ファイルシステムの制限により、1つの区画は最大約2GBまでとなっている。

Windows 95 OEM Service Release (OSR) 2 以降

AT ROM BIOSの拡張INT13hによる28ビットLogical Block Addressing (LBA、論理ブロックアドレッシング) アクセスに対応したことで、504MB(C:H:S = 1024:16:63)を超える大容量IDEハードディスクを使えるようになった。(512 bytes x 2^28 = 128 GB) また、FAT32ファイルシステムがサポートされたことにより、1区画2GBの制限も取り払われた。

区画ブートレコード (PBR、Partition Boot Record)

IBM DOS J4.0

  • 区画のBIOS Parameter Block (BPB) に記録される総セクター数を16ビットから32ビットに拡張したことで、32MBを超える基本区画を使えるようになった。(512 bytes x 2^32 = 2 TB)
  • IBMBIO.COM (MS-DOSではIO.SYS) の先頭から3セクター(1536バイト)だけロードするように変更された。
  • エラーメッセージ “Disk boot failure” が “Non-System disk or disk error” に統合された。(この時点で既にコードを512バイトのスペースに収めることに苦慮していたことが分かる)

IBM DOS J5.0/V

IBMBIO.COM (MS-DOSではIO.SYS) をデータ領域の先頭以外からロード可能になった(BPBではなくディレクトリエントリーからIBMBIO.COMの開始位置を参照するようになった)。J7.0/Vまで変更なし。

PC DOS 2000, Windows 95(内部バージョンは7.1)

2016MB(シリンダー数4096)以降の領域から起動できるようになった。

この詳細の説明はやや難しい。拡張INT13hをサポートする前のBIOSではCHS(シリンダー、ヘッド、セクター)の3つのパラメーターでハードディスクにアクセスする必要がある。一方、FATなどのファイルシステムを扱うには、ディスク先頭を0とする論理セクターアドレス (LBA) を先に算出する必要がある。ブートコードでは論理セクターアドレスをCHSに変換する際、x86 CPUのDIV命令でLBAをヘッド数で割る。この時、オーバーフロー対策のため、LBAの上位16ビットがヘッド数と同じか大きい場合は “Non-System disk or disk error” と表示して停止する。

mov dx, [LBA_H]; DX = LBA上位16ビット
mov ax, [LBA_L]; AX = LBA下位16ビット
div [SECTP]    ; DIV命令:DX:AXを[SECTP](1トラックあたりセクター数)で割る
               ; 結果:AX = 商16ビット、DX = 余り16ビット(商が65536以上になると除算エラーになる)
inc dl         ;S(セクター番号)は1から始まるためインクリメントする
mov [CURSEC], dl;Sを格納

CHSパラメーターで指定できるS(1トラックあたりセクター数)は6ビット幅で、その最大値は63。従って…

LBA    : C    H  S
4128765: 4095 15 61
4128766: 4095 15 62
4128767: 4095 15 63
4128768: 4096  0  1
(4128768 = 3F0000h, 3Fh = 63, 4128768 x 512 bytes = 2016 MB)

新しいブートコードではHとSを乗算した数でLBAを割るため、CHSパラメーターで指定できる最大値である約8GBまで問題なく扱える。なお、この不具合はDOS J4.0以降が該当する。DOS K3.3ではエラー処理がなく、除算エラーでシステムが停止する。

Windows 95 OEM Service Release (OSR) 2 以降

MBRと同様、AT ROM BIOSの拡張INT 13hによる28ビットLBAアクセスに対応したことで大容量IDEハードディスクを使えるようになった。ファイルシステムがFAT16の場合とFAT32の場合でブートコードが異なる。

ブートローダーはあくまでDOSのシステムをロードするために一時的に使われるプログラムであり、これだけを拡張INT 13h対応のコードに差し替えてもDOSそのものが拡張INT 13hに対応するわけではない。

関連記事

外部リンク


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!