Gaku's Space Wiki
トップ 一覧 最近 管理 新規 表示 差分 リンク先 参照元 履歴 編集 ヘルプ

OS/File System/FAT Last Update - 2004/10/10 15:50:46

FAT ( File Allocation Table )

広義の FAT 狭義の FAT

FAT12/FAT16/FAT32/VFAT

ディスクの管理方法

FAT File System のレイアウト

大きく5つのブロックがあり下記の順で並んでいる。 File Allocation Table は2つあり、片方は予備。 サブディレクトリやファイルは Data Area に配置される。

Boot Sector

ディスクの先頭 Sector に配置され、ディスクの情報と OS をロードするプログラム ( IPL ) を含む。 PC/AT互換機では 1sector ( 512byte ) の IPL が一般的である。

FAT12/FAT16 のレイアウト

BPB ( BIOS Parameter Block )

Extended BPB

File Allocation Table

Boot Sector に続いて、連続した Sector に FAT が配置される。 2HD の FD では FAT は通常、連続した 9sector が割り当てられる。 FAT にはファイルを確保するために Cluster 番号が並られる。 Cluster は1つ以上の連続する Sector から構成される単位で、ファイルは幾つかのクラスタで構成される。

FAT12 では1つの Cluster 番号は 12bit で表わされる。 12bit FAT のアドレスは Cluster No / 2 + Cluster No で計算できる。 ( 奇数番目の Cluster 番号と、偶数版目の Cluster 番号で合わせて 3byte である ) FAT16 では1つの Cluster 番号は 16bit で表され、先頭から順に Cluster 番号が格納される。

ある Cluster 番号に対応する FAT には、この Cluster の次に連続している Cluster 番号が書かれている。 ファイルのデータは FAT に書かれている Cluster 番号を順に辿り、取得することが出来る。

クラスタ

クラスタ 0, 1 は特別で, 0 はメディアタイプ、1 は全てのビットが1である。

FAT 中のクラスタ番号で特別な値が幾つかある。

FAT12 の例

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
 0000 F0 FF FF 03 40 00 06 F0-FF 07 F0 FF 00 00 00 00

1byte目は FAT ID で F0 とか F8 とか、続く 2byte は FF である。( Cluster 番号 0 と 1 はダミー )

 03 40 00 -> 00 4-0 03 -> クラスタ番号 3 4

この例では 2 -> 3 -> 4 -> 6 とクラスタが連結されている。

FAT16 の例

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
 0000 F0 FF FF FF 03 00 04 00-06 00 FF FF 07 00 FF FF

1byte目は FAT ID で F0 とか F8 とか、続く 3byte は FF である。( Cluster 番号 0 と 1 はダミー )

 03 00 04 00 -> 00 03 - 00 04 -> クラスタ番号 3 4

この例では 2 -> 3 -> 4 -> 6 とクラスタが連結されている。

Root Directory

File Allocation Table に続き Root Directory が配置される。 Root Directory にはファイル名やファイル属性の情報を持った Directory Entry が並ぶ。 1つの Directory Entry は 32byte ある。 通常 2HD FD には 224個の Directory Entry があり、14sector が使われる。

通常の Directory Entry には SFN ( Short File Name ) が格納され 8.3 形式のファイル名を使用できる。 LFN ( Long File Name ) を使うと最大 260文字までのパス名を使うことができる。 LFN は Directory Entry を LFN 用に複数並べて構成される。

Directory Entry レイアウト

0Ah で指定される 2byte の開始 Cluster 番号から FAT を辿るとファイルがどこにあるか分かる。 サブディレクトリはファイル名が . の Directory Entry が1つあり親ディレクトリの開始 Cluster を示す。 親ディレクトリがルートの場合は開始 Cluster は 0 にする。

Extra Data レイアウト

ファイル属性

時刻

日付

LFN レイアウト

LFN を構成する Directory Entry は最後のものから順に並んで最後に SFN 用のディレクトリエントリが並ぶ。 LFN Directory Entry は 1byte目に並び順を示す flag があり最後の LFN Directory Entry の 1byte目には 40h が OR される。

LFN Directory Entry

1つの LFN Entry には13文字が格納できる。 1つの文字は2バイトで表現される。ASCII 文字は上位バイトに 0 をつめる。 ファイル名の終端は2バイトの 0 で、余った部分は FFFF で埋める。

チェックサム計算ロジック

     mov     si,FNAME
     xor     bl,bl
     mov     cx,11
 label:
     ror     bl,1
     lodsb
     add     bl,al
     loop    label
     xchg    al,bl
     ret

Data Area

Root Directory に続き Data Area が配置される。 Data Area には、ファイルと Sub Directory ( Root Directory と同じサイズ、同じ構造 ) が格納される。( Root Directory と同じサイズてのは勘違いかもしれない。Windows の動作を見ていたら Sub Directory は 1 cluster から作成されて順次伸びて行くようだ - VFAT でだけれど ) Data Area に置かれるファイル・サブディレクトリは FAT で管理される Cluster の Chain (クラスタの連鎖) により確保される。

通常は 3.5inch 1.44MB FD では 1cluster=1sector で、この場合 33sector が Data Area 以前にある。 全セクタ数は 2880sector で、利用可能な cluster 数は 2850 個である。( 2850個てのは読んだ資料に書いてあったんだけれど、ものすごく 2847個な気がする )

参考資料

おまけ