バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのファイル上シミュレーションの話。
ディスクイメージを読み解く。
今回はFAT領域を確認してみる。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
FAT領域の位置
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
今回はFAT領域をみるわけだけど、
どこに配置されてるんだっけ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
実は以前、FAT領域は特定してある。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
あ、そっか!
128~1151セクタに配置されてるんだっけか。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
1セクタ512[byte]だから
128[セクタ]*512[byte/セクタ]=65536[byte]
65536[byte]目を参照すれば良いね。
FAT領域参照
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
じゃ、FAT領域を見てみよう。
![FAT領域、0xfffffff8、0xffffffff、0x0fffffff、0x00000004、0x0fffffff、0x00000006、0x0fffffff](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/02_FAT領域-1024x361.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
んー?
だいたいffhがならんでるけど、そうでないとこもある?
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
クラスタチェーンを示してるのがFAT領域って話だったけど
どういう感じで表現されてるの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まず、今回のフォーマットはFAT32なんで、
FAT領域の32bit単位で1クラスタのチェーン先が表現される。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
右側の表が32ibt長で区切られてるのはそれのためだね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
ちなみにFAT16とかだと1要素は16bit長になる。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
んで、話を戻して・・・。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そして、test.txtのディレクトリエントリがさしていたファイル内容はクラスタ3だった。
クラスタの番号は0から始まるので、要素の4つ目を見ることになる。
要素の4つ目を見ると、0x00000004という数値が埋まってる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
うん。確かに0x00000004だ。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
これはクラスタ3がクラスタ4に続いていることを示している。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
ほう!
これがクラスタチェーンか?!
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
あ、でもクラスタ4のところを見ると0x0fffffffになってるけど、
これはクラスタ0x0fffffffに繋がってるってこと?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
いんや。
0x0fffffffはクラスタチェーンの終端を示していて、
ここのクラスタでチェーンが終わっていることを示している。
1クラスタで情報が事足りる場合は、最初からこの終端コードが埋まってることになるね。
クラスタチェーン図解
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
とりあえず今回のクラスタチェーンを図解してみた。
![クラスタチェーン、クラスタ2、クラスタ3、クラスタ4、クラスタ5、クラスタ6、ルートディレクトリエントリ、Test.txtの内容、Test2.txtの内容、終端なのでこのクラスタだけで完結、クラスタ3はクラスタ4へチェーン、クラスタ4はチェーン終端、クラスタ5はクラスタ6へチェーン、クラスタ6はチェーン終端](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/03_クラスタチェーン-1024x449.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
ほーー!
確かにチェーン構造になってるねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
そういえば、ルートディレクトリエントリもそこあるファイル数とかフォルダとかが増えると複数のクラスタになるの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そうだね。
ディレクトリエントリは1個あたり32byteなんで、
1クラスタが4096[byte]の場合、
4096[byte]/32[byte]=128
128個のディレクトリエントリより多くなると
クラスタチェーンで別のクラスタに繋がることになる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
なるほど。
こういう仕組みでいろんな情報が伸縮自在ってことになってるのか。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- FAT領域の位置確認。
- FAT領域参照。
- FAT32の場合、32bit長データを1要素としてクラスタチェーンを表現している。
- FAT16の場合は16bit長データを1要素としている。
- 基本的には該当クラスタがどのクラスタ番号に繋がるかの数値が埋まっている。
- 0x0fffffffがチェーン終端となる。
バックナンバーはこちら。
コメント