バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのファイル上シミュレーションの話。
ディスクイメージを読み解く。
今回はFAT領域を確認してみる。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
FAT領域の位置

今回はFAT領域をみるわけだけど、
どこに配置されてるんだっけ?

実は以前、FAT領域は特定してある。

あ、そっか!
128~1151セクタに配置されてるんだっけか。

1セクタ512[byte]だから
128[セクタ]*512[byte/セクタ]=65536[byte]
65536[byte]目を参照すれば良いね。
FAT領域参照

じゃ、FAT領域を見てみよう。


んー?
だいたいffhがならんでるけど、そうでないとこもある?

クラスタチェーンを示してるのがFAT領域って話だったけど
どういう感じで表現されてるの?

まず、今回のフォーマットはFAT32なんで、
FAT領域の32bit単位で1クラスタのチェーン先が表現される。

右側の表が32ibt長で区切られてるのはそれのためだね。

ちなみにFAT16とかだと1要素は16bit長になる。

んで、話を戻して・・・。

そして、test.txtのディレクトリエントリがさしていたファイル内容はクラスタ3だった。
クラスタの番号は0から始まるので、要素の4つ目を見ることになる。
要素の4つ目を見ると、0x00000004という数値が埋まってる。

うん。確かに0x00000004だ。

これはクラスタ3がクラスタ4に続いていることを示している。

ほう!
これがクラスタチェーンか?!

あ、でもクラスタ4のところを見ると0x0fffffffになってるけど、
これはクラスタ0x0fffffffに繋がってるってこと?

いんや。
0x0fffffffはクラスタチェーンの終端を示していて、
ここのクラスタでチェーンが終わっていることを示している。
1クラスタで情報が事足りる場合は、最初からこの終端コードが埋まってることになるね。
クラスタチェーン図解

とりあえず今回のクラスタチェーンを図解してみた。


ほーー!
確かにチェーン構造になってるねー。

そういえば、ルートディレクトリエントリもそこあるファイル数とかフォルダとかが増えると複数のクラスタになるの?

そうだね。
ディレクトリエントリは1個あたり32byteなんで、
1クラスタが4096[byte]の場合、
4096[byte]/32[byte]=128
128個のディレクトリエントリより多くなると
クラスタチェーンで別のクラスタに繋がることになる。

なるほど。
こういう仕組みでいろんな情報が伸縮自在ってことになってるのか。
まとめ

まとめだよ。
- FAT領域の位置確認。
- FAT領域参照。
- FAT32の場合、32bit長データを1要素としてクラスタチェーンを表現している。
- FAT16の場合は16bit長データを1要素としている。
- 基本的には該当クラスタがどのクラスタ番号に繋がるかの数値が埋まっている。
- 0x0fffffffがチェーン終端となる。
バックナンバーはこちら。
コメント