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に対応するわけではない。