FATについて
ホームページへ戻る MP3Player1製作 FATについて2
MP3プレーヤ製作時にFATについて、勉強した内容をまとめてみました。
以下の内容は、私が個人的に調べたものを解釈しまとめたものであり、誤りがあるかもしれません。
用 語
FAT:file allocation tableの略で、ファイルのデータ位置(クラスタ)を示すテーブルのこと
通常、二重化されており読書き不良を防ぐ
セクタ:記憶装置の最小記録単位(物理フォーマット)、通常512バイト/セクタ
クラスタ:記憶領域を管理する単位(セクタの集合体、論理フォーマット)
構 成
FATファイルシステムは、4つの領域から構成されている。
(1)予約領域
ブートパラメータブロック、ディスクラベル、ブートコードなどがある。
その中でもブートセクタには、FATシステムに関するパラメータが書かれたBPB
(Bios Parameter Block)と呼ばれる領域がある。
(2)FAT領域
FATは、データ領域の位置を示すクラスタポインタの集合体である。
(3)ルートデレクトリエントリ
ファイルの属性情報(名前、時間、長さ、最初のクラスタ位置等)が記録されている。
1ファイルあたり32バイト
(4)データ領域
ファイルデータ、デレクトリデータがある領域
128MBのSDカードをFAT16で使用した例
セクタ内のデータアドレス:セクタ番号x512+Byte位置(0〜511)
BPBフィールド
ブートセクタの先頭にある64バイトのBPBフィールド(ブートセクタフィールド)は、FATファイルシステムの
パラーメータが記録されている。
主なものは次のとおり。(オフセット位置:内容)
11−12:1セクタあたりのバイト数、互換性を保つため通常512バイト
13:1クラスタあたりのセクタ数、システム記憶容量にによりかわる1・2・4・8・16・32・64・128のいづれか
14−15:ブートセクタ以降の予約領域のセクタ数
16:FATの組数、FAT領域が壊れるとダメージが大きいのでバックアップを持っている。通常2組
17−18:FAT16/12で、ルートデレクトリエントリに含まれる32バイトのエントリ数、互換上FAT16では512
19−20:FAT16/12のとき全領域のセクター数(FAT32では0)
22−23:1組のFAT領域が占めるセクタ数。
32−33:FAT32のとき全領域のセクター数
43−53:ボリュームラベルを表す11文字列。ルートデレクトリのボリュームラベルと同じ値。
FAT領域
BPB[23:22]で示されたセクタ数とBPB[16]の組数をかけたのが、FAT領域の総セクタ数になる。
FATセクタ数が240で、2組あるので480セクタがFAT領域に当てられる。
一方、1組のFATセクタ数が240あるとき、管理可能なデータ容量は、次のとおり。
FAT16:2バイト(16ビット)でひとつのセクタを管理、クラスタ/セクタ:BPB[13]は4、セクタサイズ:BPB[12:11]は512
よって、総FAT数 240x512/2=61440、データ容量 61438x4x512≒120MB (MB:メガバイト 1024x1024バイト)
(最初2つのFATはシステムで使用)
デレクトリエントリ領域
ファイルの属性(基本情報)が書かれた領域で、1ファイルあたりの32バイト占める。
通常エントリ総数は512なので、占めるセクタ数は32セクタである。
32バイトx512個/512(バイト/セクタ)=32セクタ
情報の内容は次のとおり。(オフセット位置:内容)
0−10:ファイル名 8+3(拡張子)
11:ファイル属性 read onry等
12:WINDOWSNTのための予約領域
13:ファイル作成時間の1/10秒単位をあらわす。 値は0−199で 0.1−1.99S
14−15:ファイル作成時間 時間:bit11-15 0−23h、分:bit5-10 0−59M、秒(2秒単位):bit0-4 0-29(0−58S)
16−17:ファイル作成日 年:bit9-15 0−127(1980−2107y)、月:bit5-8 1−12m、日:bit0-4 0−31d
18−19:最終アクセス日
20−21:ファイルデータの最初のクラスタ(FAT)番号上位2バイト(FAT16/12は常に0)
22−23:最終ファイル書き込み時間
24−25:最終ファイル書き込み日
26−27:ファイルデータの最初のクラスタ(FAT)番号下位2バイト
28−31:ファイルサイズバイト数 32ビット符号なし値
FATからデータ領域アクセスする例
@デレクトリエントリから、最初のFAT Noを取得
A(FAT No)−2のクラスタ*が示すデータ領域を読む、該当FATテーブルを読み次のFATNoを得る
以下、同様にFATNoがFFになるまでAを繰り返す。
*読み(書き)はセクタ単位のため、セクタアドレスを計算しセクタ/クラスタ回、セクタを読む
クラスタ先頭セクタアドレス=512(バイト/セクタ)x{(クラスタNo−2)xセクタ/クラスタ+データ領域先頭セクタ}
次セクタは、上記+512
前記のSDカードで2番目クラスタ例 512x{(7−2)x4+617}
(続編)