FATについて2
FATについて MP3player製作(ニャンプレーヤ) ホームページに戻る
FAT16におけるルートディレクトリ上のファイル検索は「FATについて」で説明しました。
今回はサブディレクトおよびそのディレクトリ上のファイルの検索方法について必要と思われる 事項
をまとめてみました。(FAT情報のHPや実際のデータから分かったことをまとめたが一部推定)
このページに対する質問・ご意見等は電子工作他の掲示板にお願いします。
ディレクトリ検索
(1)ファイル・ディレクトリを検索する上でキーとなるディレクトリエントリの値
オフセット値および内容
0:ファイル名の先頭文字であるが次の場合特別な意味を持つ。
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仕様書(英語):貴重な資料だが英語版、以前翻訳されたものがあったが今はない