FAT12/16詳細レイアウト |
位
置 |
長
さ |
内
容 |
---|---|---|
+0 |
446 |
|
+446 |
16 |
パーティションテーブル1 |
+462 |
16 |
パーティションテーブル2 |
+478 |
16 |
パーティションテーブル3 |
+494 |
16 |
パーティションテーブル4 |
+510 |
2 |
識別子 0x55aa |
位
置 |
長
さ |
内容 |
||
---|---|---|---|---|
446+0 |
1 |
ブートできる
か |
0x00 | ブート不可 |
0x80 | ブート可 | |||
446+1 |
3 |
開始ヘッダ、セク
タ、シリンダ |
||
446+4 |
1 |
システムID |
0x01 | FAT12(32680セクタ未満の場合) |
0x04 | FAT16(32,680–65,535 セクタまたは、16 MB–33 MB) | |||
0x06 | FAT16(33MB-4GB) | |||
446+5 |
3 |
終了 ヘッダ、セク
タ、シリンダ |
||
446+8 |
4 |
パーティションの開
始セクタ番号 |
||
446+12 |
4 |
パーティションのセ
クタ数 |
位
置 |
長
さ |
内
容 |
---|---|---|
+0 |
3 |
ジャンプ命令。ブートできる/できないにかかわらず 0xEB
で始まるジャンプ命令が格納されていないとディスクとして認識されない。 |
+3 |
8 |
OEM ID("MSDOS 5.0"など文字で格納される) |
+11 |
25 |
バイオスパラメータブロック(BPB) |
+36 |
26 |
拡張BPB |
+62 |
448 |
起動命令コード |
+510 |
2 |
識別子(0x55aa) |
位
置 |
長
さ |
内容 |
||
---|---|---|---|---|
11+0 |
2 |
1セクタのバイト数 |
||
11+2 |
1 |
1クラスタのセクタ
数 |
||
11+3 |
2 |
予約セクタ。FAT
とBSRの隙間が無いときは1。BSRぶんも含む。 |
||
11+5 |
1 |
FATの数。常に
2。 |
||
11+6 |
2 |
ルートディレクトリ
エントリ数。通常512。 |
||
11+8 |
2 |
セクタ数。
65536セクタ未満の場合はここに格納される。 |
||
11+10 |
1 |
メディア識別
子。 |
0xF8 |
ハードディスク |
0xF0 |
フロッピー |
|||
11+11 |
2 |
1つのFATのセク タ数。 | ||
11+13 |
2 |
1トラックのセクタ
数。 |
||
11+15 |
2 |
ヘッド数。 |
||
11+17 |
4 |
隠されたセクタ数。
MBRの位置からBSRの位置のセクタ数。 |
||
11+21 |
4 |
大きなサイズのセク タ数。セクタ数が65536セクタ以上のときはここに格納される。 |
拡張BPB |
位
置 |
長
さ |
内容 |
||
---|---|---|---|---|
11+25 |
1 |
物理ドライブ
番号 |
0x80 |
ハードディスク |
0x00 |
フロッピー |
|||
11+26 |
1 |
予約 |
||
11+27 |
1 |
拡張識別子。
0x28または0x29。 |
||
11+28 |
4 |
ボリュームシ
リアル番号。フォーマット時にランダムな番号を入れる。 |
||
11+32 |
11 |
ボリュームラ
ベル。"NO NAME"。 |
||
11+43 |
8 |
ファイルシス
テム型。"FAT16 "などと文字列で入る。 |
ディレクト リレイアウト |
位
置 |
長
さ |
内容 |
||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+0 |
11 |
ファイル名。
ショートファイル名。8文字+3文字形式。 先頭1バイトが識別子の役割をしている。 0x00:未使用領域 0x05:漢字コードで先頭バイトが0xe5のとき0x05に置き換える 0xe5:削除されたエントリ |
||||||||||||||||||||||||||||||||||||||||
+11 |
1 |
ファイル属性 |
0x01 |
読み取り専用 |
||||||||||||||||||||||||||||||||||||||
0x02 |
隠しファイル |
|||||||||||||||||||||||||||||||||||||||||
0x04 |
システムファイル |
|||||||||||||||||||||||||||||||||||||||||
0x08 |
ボリュームラベル |
|||||||||||||||||||||||||||||||||||||||||
0x10 |
ディレクトリ |
|||||||||||||||||||||||||||||||||||||||||
0x20 |
圧縮 |
|||||||||||||||||||||||||||||||||||||||||
0x0f |
ロングファイル名 |
|||||||||||||||||||||||||||||||||||||||||
+12 |
1 |
ファイル名の
小文字判定ビット |
0x08 |
ファイル名の始めの8文字が小文字。 |
||||||||||||||||||||||||||||||||||||||
0x10 |
拡張子が小文字。 |
|||||||||||||||||||||||||||||||||||||||||
+13 |
1 |
ファイル生成
時刻の10ms単位。2秒までの時刻を格納する。 |
||||||||||||||||||||||||||||||||||||||||
+14 |
2 |
ファイル生成
時刻 |
||||||||||||||||||||||||||||||||||||||||
+16 |
2 |
ファイ生成日
付 |
||||||||||||||||||||||||||||||||||||||||
+18 |
2 |
最終アクセス
日付 |
||||||||||||||||||||||||||||||||||||||||
+20 |
2 |
未使用。
FAT32のときクラスタ番号の上位桁が格納される |
||||||||||||||||||||||||||||||||||||||||
+22 |
2 |
更新時刻 |
||||||||||||||||||||||||||||||||||||||||
+24 |
2 |
更新日付 |
||||||||||||||||||||||||||||||||||||||||
+26 |
2 |
先頭クラスタ
番号 |
||||||||||||||||||||||||||||||||||||||||
+28 |
4 |
ファイル長 |
||||||||||||||||||||||||||||||||||||||||
|
位
置 |
長
さ |
内容 |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+0 |
1 |
ロングファイル名エ
ントリの番号。0x40のビットが立っていると終端。 |
||||||||||||
+1 |
10 |
ファイル名1(5文
字) |
||||||||||||
+11 |
1 |
属性 0x0f
ロングファイル名 |
||||||||||||
+12 |
1 |
0 |
||||||||||||
+13 |
1 |
チェックサム |
||||||||||||
+14 |
12 |
ファイル名2
(6文字) |
||||||||||||
+26 |
2 |
常に0。 |
||||||||||||
+28 |
4 |
ファイル名3
(2文字) |
||||||||||||
|
FATは1次元の配列でクラスタの状態、次にどのクラスタがつながる
かというクラスタチェイン情報を持ちます。 ディレクトリに格納されているクラスタ番号から先頭のクラスタ番号が分かります。そのクラスタの最後に到達するとFATを見て続きのクラスタを探しま す。 ディスク上の配置 FATファイルシステムは86系のCPUで開発された のでリトルエ ンディアンで考えられています。私はリトルエンディアンにあまりなじみがないのでなかなか理解に苦しみました。FAT16は2バイトでクラスタの情報をあ らわすため反転するだけでいいのですが、FAT12は12ビット、つまり1バイト半なのでやっかいです。 クラスタ番号からFAT内の該当する位置を求めるためにはまず先頭からのビット位置を求め、それを1バイトのビット数(8)で割ってバイト位置を求めま す。余りがある場合はシフト、余りのない場合は上位4ビットをクリアする、という方法で器械的に求めることができます。 [クラスタ番号]×[12ビット]=ビット位置 [ビット位置]÷8=バイト位置 クラスタ2で考えてみると、 2×12=24 24÷8=3余り0 なので3バイト目からの2バイトを反転させて、上位4ビットをクリアします。 クラスタ3の場合は、 3×12=36 36÷8=4余り4 だから、4バイト目からの2バイトを反転させ4ビットシフトです。 |