FAT12/16詳細レイアウト


MBRのレ イアウト
位 置
長 さ
内 容
+0
446

+446
16
パーティションテーブル1
+462
16
パーティションテーブル2
+478
16
パーティションテーブル3
+494
16
パーティションテーブル4
+510
2
識別子 0x55aa


パーティショ ンテーブル1
位 置
長 さ
内容
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
パーティションのセ クタ数


 
BSRのレ イアウト
位 置
長 さ
内 容
+0
3
ジャンプ命令。ブートできる/できないにかかわらず 0xEB で始まるジャンプ命令が格納されていないとディスクとして認識されない。
+3
8
OEM ID("MSDOS 5.0"など文字で格納される)
+11
25
バイオスパラメータブロック(BPB)
+36
26
拡張BPB
+62
448
起動命令コード
+510
2
識別子(0x55aa)

 
BPBのレ イアウト
位 置
長 さ
内容
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
ファイル長

ファ イル生成時刻、更新時刻(+14、+22)

 時刻内の各項目は必要なビット数しか確保していません。 時:5ビット、分:6 ビット、秒:5ビット。秒は0〜59で6ビット必要なはずです が2 秒単位で格納 することになっているので、0〜29が格納されます。ファイル生成時刻の10ms単位の時刻が2秒未満をあらわすのはそのためです。ワードで表現すると以 下のよ うになります。リトルエンディアンなので物理的には上位下位バイトが反転して格納されます。

hhhh hmmm
mmms ssss

日付(+ 16、+18、 +24)

 同様に日付をワードで表現すると以下のようになりま す。

yyyy yyym
mmmd dddd

 年は1980年を 0 とし7ビットで表現できる最大値 127 まで格納できるので、 1980+127 = 2107年まで格納できます。月日はそれぞれ1〜12、1〜31となります。

ファ イル名 の小文字判定ビット(+12)  

 ショートファイル名(DOS)のルールでは小文字は 許されていま せん。しか し、Windowsで小文字だけのファイル名を作ってもロングファイル名のエントリは作成されません。実際のファイル名は大文字で登録されこのビットが立ちます。このビットが立っていると小文字で表示されます。
 
ファイル作成の例
ファイル
名の例
ロ ング
ファイル名
生成

実際に格 納される文字列
解説
ABC.TXT
×
ABC TXT
ファイル名がそのまま格納される
abc.txt
×
ABC TXT
大文字に変換されたファイル名が格納される
abc.TXT
×
ABC TXT
この場合も同様にロングファイル名のエ ントリは作成 されない。
Abc.txt

ABC  TXT
同様に大文字に変換されて格納されるがロング ファイル名の エントリも作成される。
abc#.txt
×
ABC#  TXT
この場合もロングファイル名は作られない。

 上の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文字)

ロン グファイル名 エントリの番号(+0)  

 ショートファイル名エントリの直前にロングファイル 名エントリは 作成されます。複数レコードにわたる場合があるのでその順番を示 す番号が1〜振られていきます。0x40とORを取った値になっているレコードが最終レコードです。


チェッ クサム(+ 13)

  ショートファイル名の11バイトのサムが対応する ロングファイ ル名レコードすべてに格納されます。チェックサムの計算は現在のサム値を右に1ビットづつローテートしながらファイル名のキャラクタを加算していきます。
ロングファイル名のsum計算
  ショートファイル名が"ABC..."となっている例です。始めにsum値は0にしておき"A"のコード0x41を足します。次にその結果を1ビットロー テートして0xA0にします。それに"B"の 0x42 を足し0xE2とします。それを11バイトぶん繰り返します。

ロ ングファイル名エントリが作成される位置

 "My Name Is Pochi.txt"というファイル名がディレクトリエントリに格納される様子を示しています。
ロングファイル名エントリ格納位置
 一番最後にショートファイル名のエントリが作成されます。そ のレコードに 作成日付やファイルに関する情報が格納されます。ロングファイル名はその直前に作成され、順番が先頭バイトに格納されます。




FATのレイアウト
 FATは1次元の配列でクラスタの状態、次にどのクラスタがつながる かというクラスタチェイン情報を持ちます。

FATの説明
 FATの先頭2つの要素は常に未使用でFAT16では0xfff8、0xffff、FAT12では0xff8、0xfffが格納されています。クラスタ 番号は2から始まると考えます。上記の例ではクラスタ2の続きがクラスタ3でその続きがクラスタ4であることをあらわし、クラスタ4には終端マークが格納 されています。クラスタ5とクラスタ6は未使用です。
 ディレクトリに格納されているクラスタ番号から先頭のクラスタ番号が分かります。そのクラスタの最後に到達するとFATを見て続きのクラスタを探しま す。

ディスク上の配置
 FATファイルシステムは86系のCPUで開発された のでリトルエ ンディアンで考えられています。私はリトルエンディアンにあまりなじみがないのでなかなか理解に苦しみました。FAT16は2バイトでクラスタの情報をあ らわすため反転するだけでいいのですが、FAT12は12ビット、つまり1バイト半なのでやっかいです。
FAT12の説明
 FAT12のディスク上の配置です。
 クラスタ番号から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ビットシフトです。