結局、この辺に戻ってくるらしい。
例えば、最新の環境でUSBメモリの読み書きを行おうとしても、
FAT32がデファクトスタンダードであるので、全く無視する訳にもいかない。
とは言え、ほとんどが、後方互換の為に残されている物であって、
現在のOS事情においては、参考程度の情報かもしれない。
BPB (BIOS Parameter Block)
FAT12の時代からある、予約領域の先頭セクタに配置されるデータ構造。
ボリュームに関する諸情報が格納されている。
ブートローダーを含む場合は、
VBR (Volume Boot Record) や PBR (Partition Boot Record) などとも呼ばれる。
BS_から始まる名前は、ブートセクタの要素。
BPB_から始まる名前は、BPBの要素。
FAT12/16/32共通
| 名前 | オフセット | サイズ | 内容 |
|---|---|---|---|
| BS_JmpBoot | 0 | 3 |
ブートストラップコードへのジャンプ命令(x86命令)。 0xEB, 0x??, 0x90 (ショートジャンプ+NOP) 一般的には、前者。 |
| BS_OEMName | 3 | 8 |
OEM名識別⼦。 任意の値で良いが、互換性を重視する場合、 "MSWIN4.1"や"MSDOS5.0"が使われる。 |
| BPB_BytsPerSec | 11 | 2 |
セクタあたりのバイト数。 512、1024、2048、4096のいずれか。 ストレージのセクタサイズと同一になる。 互換性を重視する場合、512が、最も安全性が高い。 |
| BPB_SecPerClus | 13 | 1 |
クラスタあたりのセクタ数。 0より大きい、2の累乗でなければならない。 要するに、8bit中、いずれかのbitが1となる。 互換性を重視する場合、 セクタサイズは、32Kバイト以下が望ましい。 |
| BPB_RsvdSecCnt | 14 | 2 |
予約セクタ数 (FAT1領域の直前までのセクタ数) 0以外、任意の値を設定可能であるが、 互換性を重視する場合、 FAT12/16では、1が望ましく、 FAT32では、主に32とする事が多い。 |
| BPB_NumFATs | 16 | 1 |
FATの数。 互換性を重視する場合、常に2が望ましい。 |
| BPB_RootEntCnt | 17 | 2 |
FAT12/16における、 ルートディレクトリエントリの最大数。 32倍して、2セクタ分の倍数となる必要がある。 互換性を重視する場合、 FAT16では、512とする事が望ましい。 FAT32では、常に0。 |
| BPB_TotSec16 | 19 | 2 |
全セクタ数(古い16ビットフィールド)。 FAT12/16では、セクタ数が0xFFFF以下の場合有効。 0x10000以上の場合は、0。 FAT32では、常に0。 |
| BPB_Media | 21 | 1 |
固定ドライブの場合、0xF8が標準。 リムーバブルメディアの場合、0x0Fが多い。 これと同じ値をFAT[0]の下位8bitに置く。 |
| BPB_FATSz16 | 22 | 2 |
一つのFATが占めるセクタ数。 FAT12/16でのみ有効。 FAT32では、常に0。 |
| BPB_SecPerTrk | 24 | 2 |
トラックあたりのセクタ数。 現在では、ほとんど意味がない。 |
| BPB_NumHeads | 26 | 2 |
ヘッド数。 現在では、ほとんど意味がない。 |
| BPB_HiddSec | 28 | 4 |
隠しセクタ数。 パーティション分割されていない場合、常に0。 現在では、ほとんど意味がない。 |
| BPB_TotSec32 | 32 | 4 |
全セクタ数(新しい32ビットフィールド)。 FAT12/16では、セクタ数が0x10000以上の場合有効。 0xFFFF以下の場合は、0。 FAT32では、常に有効。 |
FAT12/16 (オフセット36以降)
| 名前 | オフセット | サイズ | 内容 |
|---|---|---|---|
| BS_DrvNum | 36 | 1 |
ドライブ番号。 INT13hで使用。 フロッピーディスクでは、0x00、 固定ディスクでは、0x80。 |
| BS_Reserved | 37 | 1 |
予約。 WindowsNTで使用されているらしい? 通常は、0x00を設定。 |
| BS_BootSig | 38 | 1 |
拡張ブートシグネチャ。 続く2つのフィールドが有効な場合、 0x29を設定する。 |
| BS_VolID | 39 | 4 |
ボリュームシリアル番号。 不正なメディア交換を検出する為のヒント。 大抵は現在時刻から生成される。 |
| BS_VolLab | 43 | 11 |
ボリュームラベル。 ルートディレクトリのボリュームラベルに一致する。 ボリュームラベルが無い場合は、"NO NAME "。 |
| BS_FilSysType | 54 | 8 |
大抵の場合、 "FAT12 ", "FAT16 ","FAT " のうちいずれかの文字列。 この文字列は情報提供のみを目的としており、 FATタイプを決定するものではない。 |
| BS_BootCode | 62 | 448 |
ブートストラップコード。 未使用時はゼロで埋める。 |
| BS_Sign | 510 | 2 |
ブートシグネチャ。 0xAA55をリトルエンディアンで設定するので、 オフセット510 = 0x55 オフセット511 = 0xAA となる。 |
| --- | 512 | --- | セクタサイズが512を超える場合は、0x00で埋める。 |
FAT32 (オフセット36以降)
| 名前 | オフセット | サイズ | 内容 |
|---|---|---|---|
| BPB_FATSz32 | 36 | 4 |
1つのFATが専有するセクタ数。 |
| BPB_ExtFlags | 40 | 2 |
ビット3~0: 0から始まるアクティブなFAT。 ビット7が1のとき有効。 予約。 0は全てのFATがミラーリングされることを示す。 1はビット3~0で示される1個のFATだけがアクティブであることを示す。 予約。 |
| BPB_FSVer | 42 | 2 |
FAT32ボリュームのバージョン。 上位バイトがメジャーバージョン番号、 下位バイトがマイナーバージョン番号。 |
| BPB_RootClus | 44 | 4 |
ルートディレクトリの先頭クラスタ番号。 大抵は先頭クラスタである 2 が設定される。 |
| BPB_FSInfo | 48 | 2 |
予約領域中でFSINFO構造体の置かれるセクタ番号。 大抵はブートセクタの次である 1 が設定される。 |
| BPB_BkBootSec | 50 | 2 |
0以外の場合、予約領域中でブートセクタのバックアップが配置されるセクタを示す。 大抵はブートセクタの6セクタ先である 6 が設定される。 |
| BPB_Reserved | 52 | 12 |
予約。 0x00で埋める。 |
| BS_DrvNum | 64 | 1 |
ドライブ番号。 INT13hで使用。 フロッピーディスクでは、0x00、 固定ディスクでは、0x80。 |
| BS_Reserved | 65 | 1 |
予約。 WindowsNTで使用されているらしい? 通常は、0x00を設定。 |
| BS_BootSig | 66 | 1 |
拡張ブートシグネチャ。 続く2つのフィールドが有効な場合、 0x29を設定する。 |
| BS_VolID | 67 | 4 |
ボリュームシリアル番号。 不正なメディア交換を検出する為のヒント。 大抵は現在時刻から生成される。 |
| BS_VolLab | 71 | 11 |
ボリュームラベル。 ルートディレクトリのボリュームラベルに一致する。 ボリュームラベルが無い場合は、"NO NAME "。 |
| BS_FilSysType | 82 | 8 |
常に"FAT32 "。 この文字列は情報提供のみを目的としており、 FATタイプを決定するものではない。 |
| BS_BootCode | 90 | 420 |
ブートストラップコード。 未使用時はゼロで埋める。 |
| BS_Sign | 510 | 2 |
ブートシグネチャ。 0xAA55をリトルエンディアンで設定するので、 オフセット510 = 0x55 オフセット511 = 0xAA となる。 |
| --- | 512 | --- | セクタサイズが512を超える場合は、0x00で埋める。 |
なんと言うか...
PC黎明期からの歴史を感じつつも、今となっては、かなり無理を感じる...
当時は、メモリもストレージも、まだまだ容量が小さくて、
1Byteでも無駄に出来ない... そんな雰囲気があったもんなぁ...
それが、今の時代、容量を気にせず、利便性を追求できるので、
過去の資産を考慮しなければ、もう少し、すっきりした構造に出来そうだけど、
x86含め、互換性重視だと、どうしても、継ぎ足し継ぎ足し構造になっちゃうね。