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で使用した例

     BPB.GIF - 2,997BYTES

      セクタ内のデータアドレス:セクタ番号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.GIF - 4,818BYTES

      @デレクトリエントリから、最初のFAT Noを取得 

      A(FAT No)−2のクラスタが示すデータ領域を読む、該当FATテーブルを読み次のFATNoを得る

     以下、同様にFATNoがFFになるまでAを繰り返す。

       *読み(書き)はセクタ単位のため、セクタアドレスを計算しセクタ/クラスタ回、セクタを読む

         クラスタ先頭セクタアドレス=512(バイト/セクタ)x{(クラスタNo−2)xセクタ/クラスタ+データ領域先頭セクタ}

          次セクタは、上記+512

       前記のSDカードで2番目クラスタ例    512x{(7−2)x4+617}

(続編)

FATについて2