FATについて2     FATについて  MP3player製作(ニャンプレーヤ  ホームページに戻る

  

  FAT16におけるルートディレクトリ上のファイル検索は「FATについて」で説明しました。

 今回はサブディレクトおよびそのディレクトリ上のファイルの検索方法について必要と思われる 事項

をまとめてみました。(FAT情報のHPや実際のデータから分かったことをまとめたが一部推定)

 

   このページに対する質問・ご意見等は電子工作他の掲示板にお願いします。

 

ディレクトリ検索

(1)ファイル・ディレクトリを検索する上でキーとなるディレクトリエントリの値

オフセット値および内容

:ファイル名の先頭文字であるが次の場合特別な意味を持つ。

  00h 空のエントリ(これ以降エントリなし)

  E5h 削除されたエントリ(使用可能)

 <サブデレクトリ(ルートディレクエントリ以外)>

  2Eh ディレクトリのクラスタ(セクタ)先頭に配置される2つエントリでdot(.)

エントリと、dotdotエントリ(オフセット1も2Eh)の場合。

dotエントリ         そのディレクトリ情報のエントリ

dotdotエントリ       そのディレクトリの上位ディレクトリ情報のエントリ

  11:ファイル属性

     各ビットの意味

0bit 読取り専用、1bit 隠しファイル、2bit システムファイル

3bit ボリュームラベル、4bit ディレクトリ、5bit アーカイブ

6bit・7bit 予約常に0

具体的な値()とエントリの種類

20h ファイル(書込み・変更有)エントリ

      10h ディレクトリエントリ 

      08h ボリュームラベルエントリ(ボリュームラベル設定時ルートディレクエントリに作られる)

      0Fh ロングファイルネーム(LFN)用の拡張エントリ

      *注:属性が変更されるとビットの組み合わせとなり、上記値と異なる。

(2)ディレクトリエントリ上のファイル・デレクトリ検索手順

   @先頭のエントリから、順次32バイト読込む。

   Aエントリの0バイト

     00h→それ以降にエントリ(ファイル・ディレクトリ)なし検索終了

     E5h・2Eh→次のエントリを検索

   Bエントリの11バイト

     0Fh・08h→次のエントリを検索

     10h→エントリの26:27バイトを読込み、サブ(下位)ディレクトリの最初の

 クラスタNoを得る。(サブディレクトリ内の検索も同様に@から実施)

     20hエントリの26:27バイトを読込み、ファイルの最初のクラスタNoを得る。

         クラスタチェーンをたどり、ファイル読み込み。(FATについて参照)

   上記@−Bを最終(空)エントリまで繰り返す。

    エントリの最大数

     ルートディレクトリ:BPBの17:18の値 FAT16は512(32セクタ

     サブディレクトリ:ファイルと同様にクラスタチェーンで繋がってる(上限なし)

 

(3)上位・下位ディレクトリの関連付け

   上位→下位:(2)のBによる。

   下位→上位:そのディレクトリのdotdotエントリの26:27バイトが上位のクラスタNo

を示す。(0000hの場合は、上位はルートディレクトリ)

        (dotエントリの26:27バイトはそのディレクトリクラスタNo)

 

(4)LFNエントリ構成

   拡張エントリも32バイトで、拡張部分の最後からはじまり、基本(通常)のエントリが最後にある。

   拡張エントリ(最後)・・・拡張エントリ(2番目)−拡張エントリ(1番目)−基本エントリ

   拡張エントリの0バイトめの値 

     最後のエントリ:4nh nは順番を示す、3つあれば43h

     その他エントリ:0nh nは順番を示す、1つめは01h

    *LFNの詳細は省略(他のHPを見てください)

 

ディスクデータの例

 フロッピーデスク(FAT12)の内容を確認した。

 (SDカード「FAT16」で確認したかったが読込めるソフトがなかった、基本はFAT16も同様)

   セクタ長:512バイト、クラスタサイズ:1セクタ 予約領域:1セクタ

   FAT領域:9セクタx2組、ルートディレクトリエントリ数:224(14セクタ)

 

FATテーブル  アドレス:512(200h)

 000200   F0 FF FF FF FF FF FF 1F   02 FF FF FF FF FF FF FF

 000210   FF FF FF FF FF FF FF FF   11 20 01 13 40 01 15 60

 000220   01 17 80 01 19 A0 01 1B   C0 01 1D E0 01 1F 00 02

 000230   FF FF FF 00 00 00 00 00   00 00 00 00 00 00 00 00

  FAT値 0:FF0 1:FFF 2:FFF 3:FFF 4:FFF 5:021 6:FFF

 

ルートディレクトリエントリ  アドレス:1+18=19セクタ→9728(2600h)

 002600   44 49 53 4B 20 54 45 53   54 20 20 08 00 00 00 00  DISK TEST  .....

 002610   00 00 00 00 00 00 E9 8B   88 32 00 00 00 00 00 00  .......笈2......

          ボリュームラベル「DISK TEST」のエントリ

           

 002620   31 20 20 20 20 20 20 20   54 58 54 20 10 1B ED 8B  1       TXT ....

 002630   88 32 88 32 00 00 C7 43   88 32 02 00 10 00 00 00  .2.2...C.2......

     ファイル「1.txt」エントリ スタートクラスタNo2 (2-2)×512+4200h→4200h

 

 002680   41 20 20 20 20 20 20 20   20 20 20 10 08 91 F7 8B  A          ..濁.

 002690   88 32 8C 32 00 00 F8 8B   88 32 05 00 00 00 00 00  .2.2...笈2......

     デレクトリ「A」エントリ スタートクラスタNo5 (5-2)×512+4200h→4800h

 

データエリア 先頭アドレス:1+18+14=33セクタ→16896(4200h)

 <デレクトリ「A」の先頭>

 004800   2E 20 20 20 20 20 20 20   20 20 20 10 00 91 F7 8B  .          ..濁.

 004810   88 32 88 32 00 00 F8 8B   88 32 05 00 00 00 00 00  .2.2...笈2......

 004820   2E 2E 20 20 20 20 20 20   20 20 20 10 00 91 F7 8B  ..         ..濁.

 004830   88 32 88 32 00 00 F8 8B   88 32 00 00 00 00 00 00  .2.2...笈2......

            1つ目dotエントリ デレクトリ「A」の情報 

       2つ目dotdotエントリ デレクトリ「A」の上位デレクトリ情報

                  スタートクラスタNoが0000hであり、ルートデレクトリ

     

 0049A0   E5 21 FF 12 FF 2E 00 74   00 78 00 0F 00 D1 74 00  .!.....t.x....t.

 0049B0   00 00 FF FF FF FF FF FF   FF FF 00 00 FF FF FF FF  ................

     削除されたエントリ

 

 0049E0   42 78 00 74 00 00 00 FF   FF FF FF 0F 00 3E FF FF  Bx.t.........>..

 0049F0   FF FF FF FF FF FF FF FF   FF FF 00 00 FF FF FF FF  ................

 008000   01 21 FF 15 FF 16 FF 17   FF 18 FF 0F 00 3E 19 FF  .!...........>..

 008010   10 FF 11 FF 12 FF 13 FF   14 FF 00 00 2E 00 74 00  ..............t.

 008020   82 60 82 54 82 55 7E 31   54 58 54 20 00 76 DB 9E  A56~1TXT .v..

 008030   8B 32 8B 32 00 00 DC 9E   8B 32 0A 00 00 00 00 00  .2.2...梛2......

     1番目 ロングネーム用拡張最終(2番目)エントリ

     2番目 ロングネーム用拡張1番目のエントリ

     3番目 基本ファイルエントリ スタートクラスタNo0Ah(10) (10-2)x512+4200h→5200h    

    1番目のエントリで、デレクトリ「A」のクラスタ(セクタ)が終了となり05h番目の

    FATの示す、021h(33)番目のクラスタにエントリが続く (33-2)×512+4200h→8000h
 
 ・ルートディレクトリエントリ領域は、ルートディレクトリ上のファイルおよびディレクトリのエントリ情報
  がある。(32バイト単位)

 ・データエリアには、ディレクトリ上にあるエントリ情報とファイルのデータがあり、どちらもクラスタ単位
  に管理され、FATによるチェーン構造となっている。
  エントリ領域は、ルートディレクトリエントリと同様の構造となっている。(FATチェーンにより拡張あり)
 ・ファイルのエントリ情報がある場所によって、ディレクトリ構造を実現している。
  ディレクトリ「A」にサブディレクトを作成すると、「A」エントリ領域に新たに、ディレクトリのエント
  リが追加される。

関連・参考となるHP

 FAT FS フォーマットの実装についての覚え書き:FATについて詳しく解説されている

 マイクロソフトのFAT仕様書(英語)貴重な資料だが英語版、以前翻訳されたものがあったが今はない