FD のセクター 1 〜 9 は FAT ( File Allocation Table ) と呼ばれる領域で、
クラスターの使用状況や次に続くクラスター番号を記録する。
FAT 領域全体を特定ビット数のブロックに分割し、ブロックの位置をクラスター番号に対応させることでファイル記録位置を管理する。
1ブロック (FAT データ) 当たりのビット数にはディスクの容量やBIOS・OS の対応などから、12, 16, 32 ビット等の規格がある。
前述の通り、FAT のデータはクラスター番号の指定にも使われ、ビット数によって指定できるクラスター番号にも限界がある。
少ないビット数の FAT では大きなディスクは扱えない。
1.44MB タイプの FD に用いられる FAT が FAT12 と呼ばれるのは、FAT のデータサイズ (ブロック) が 12ビットであることに由来する。
- FAT 領域を 12ビットのデータ サイズで分割する。
- FAT データ の位置をクラスター番号に対応させる。
- クラスターの "0" と "1" に該当する部分 ( FAT データ の先頭 2つ ) は特別で下記データを格納する。
クラスター番号 | 格納データ |
クラスター 0 | メディアタイプ 0xFF0 : 3.5 inch FD, 0xFF8 : Hard Disk |
クラスター 1 | 0xFFF ( すべてのビットが "1" ) |
- 上記仕様のため Data Area の先頭クラスター番号は "2" となる。
- FAT データが次に示す値の場合は特別な意味を表す。
FAT データ | 意味 |
0x000 | 空き |
0xFF8 〜 0xFFF | End Of Cluster ( 最終Cluster ) |
0xFF7 | 不良 Cluster |
- FAT 構造の概念図を示すと次のようになる。
メディア タイプ | 0xFFF | クラスター2の管理 | クラスター3の管理 | クラスター4の管理 | ・・・・・・・ |
← 12ビット → | ← 12ビット → | ← 12ビット → | ← 12ビット → | ← 12ビット → | ・・・・・・・ |
← 3バイト → | ← 3バイト → | ・・・・・・・・・・ |
ファイルの大きさがクラスター サイズを超えていると、ファイルは複数クラスターに分散して格納しなければならない。
またファイル読み出し時には、これら分散しているクラスターを適切に追跡できる仕組みが必要となる。
クラスターの追跡に Directory Entry と FAT のデータがどのように使われるのか、以下にその一例を示す。
ファイル サイズ 2500バイトの test.doc を保存した時、Directory Entry と FAT のデータが下記状態であったと仮定する。
- Directory Entry
ファイル名 | 拡張子 | 属性〜更新日付 | 先頭クラスター番号 | ファイル サイズ |
test | doc | ・・・・・・・・・・・ | 0x0002 | 0x000009C4 |
- FAT
該当クラスター番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
FAT データ | 0xFF0 | 0xFFF | 0x003 | 0x004 | 0x006 | 0xFF8 | 0x007 | 0xFF8 |
これらのデータを参照し、次の手順でクラスターを追跡する。
- Directory Entry から先頭クラスター番号 0x002 を得る。
- FAT の該当クラスター番号 2 の位置に記録されている値を参照する。
値が 0xFF8 〜 0x0FFF (最終クラスター) ではないので、その値は続きのクラスター番号 0x003 を示していると認識する。
- 同様にして 続きのクラスター番号 0x004, 0x006, 0x007 を得る。
- 該当クラスター番号 7 の値は 0xFF8 となっているので、最終クラスターであると識別する。
ファイルを削除すると Directory Entry1 と FAT に以下の処理が行われる。
- Directory Entry
先頭の 1バイトを 0xE5 に書き換える。
- FAT
当該ファイル用に使用していたすべての FAT データを 0x000 に書き換える。
FAT12 は 12ビット構成のため、バイト サイズ (8ビット) を多用する PC としては異質にも思えるが、
コンパクトで十分な機能という開発時の要請に添ったものといえる。
FAT 領域をダンプすると、2つの FAT データを 3バイトに収めている様子を見る事が出来る。
前項の例で挙げた FAT データをダンプすると、次のようになる。
【 セクター 1 のダンプ ( 冒頭 16バイト ) 】
offset | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
FAT データ | F0 | FF | FF | 03 | 40 | 00 | 06 | 80 | FF | 07 | 80 | FF | F8 | AF | 00 | 0B |
FAT の生データを人間が直感的に判読するのは難しいが、メモリー上のデータとして捉えるとイメージしやすい。
右図はダンプ データの offset +3 〜 +5 (クラスター番号 2, 3 に該当) のデータをメモリー上に配置した概念図だ。
このデータを次のように読む。
- クラスター2 に該当するデータは、+4 の下位 4ビットと +3 の 8ビットを繋いで(緑線)、0x003 が得られる。
- クラスター3 に該当するデータは、+5 の 8ビットと +4の 上位 4ビットを繋いで(オレンジ線)、0x004 が得られる。