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

イラスト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
ルートディレクトリエントリの位置

前回、いろいろ情報を書きか詰めた結果、
1152セクタ目からルートディレクトリエントリが始まってることがわかった。
1152[セクタ]*512[byte/セクタ]=589824[byte]=0x90000[byte]
というわけで、ディスクイメージの0x90000[byte]目を参照しれば良いってことか。

その通り。

じゃーさっそく見てみよう。
ルートディレクトリエントリ参照

こんな感じだな。
![struct DIR_ENTRY_t{ BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize;};ファイル名、ファイル属性、ファイルサイズ](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/02_ルートディレクトリエントリ-1024x717.png)

ディレクトリエントリは32byteで1個のデータで
画像にはtest.txtとtest2.txtのエントリが存在しているのが分かる。

そういえば、test.txtとtest2.txtってファイルを作ったんだっけか。

そして、
test.txtは7000byteを書き込んで、
test2.txtには8000byteを書き込んだから、
サイズも一致してるね。
ファイルの中身の情報は?

で、実際のファイルの中身の情報はどこにあるんだ?

DIR_FstClusHIとDIR_FstClusLOに先頭クラスタ位置が埋まってるんで、そこから特定する感じだね。

クラスタって複数のセクタを一まとめにした読み書き単位だっけ?
今回の場合だと確か、8セクタで1クラスタって情報が埋まってたから
4096[byte]が1クラスタか。

そうそう。

そして、DIR_FstClusHIとDIR_FstClusLOで指定されたクラスタが、
そのファイルの中身の情報を記録しているところってことか。

名前的にはDIR_FstClusHIが上位16bit、DIR_FstClusLOが下位16bitになってるのかな?

それも正解。
今回のtest.txtの場合だと、
DIR_FstClusHI=0x0000
DIR_FstClusLO=0x0003
なので、3クラスタ目からが該当ファイルの中身の情報が記録されてる。

3クラスタ目って具体的にはどこになるの?

それを把握するには、ルートディレクトリエントリ自体が何番のクラスタなのかを知っておく必要がある。

どこになるの?

今回の場合、
ルートディレクトリエントリはクラスタ2になるね。

その情報はどこで????

実はBPB(BIOS Parameter Block)に埋まってる情報で。
BPB(BIOS Parameter Block)を読み出した回の時も重要パラメータとして紹介はしてる。

あ!
ほんとだ!
BPB_RootClusが2ってことで、
ルートディレクトリエントリのクラスタが2ってことになるか!

でもなんで2?
0とか1とかじゃなくて?

内容を入力してください。理由ははっきりしてないのだが、
昔からクラスタ2を先頭クラスタとしていたようだ。
処理系によっては、クラスタ2が先頭クラスタであることを前提に作られてる場合もあり得るらしいので、
クラスタ2にしておいた方が無難ってとこだな。理由ははっきりしてないのだが、
昔からクラスタ2を先頭クラスタとしていたようだ。
処理系によっては、クラスタ2が先頭クラスタであることを前提に作られてる場合もあり得るらしいので、
クラスタ2にしておいた方が無難ってとこだな。

うーん。
まぁFAT自体がそうとう歴史が長そうだからなー。
そういうのもあるのかー。

というわけで次回はファイルの中身のデータを参照してみよう。
まとめ

まとめだよ。
- ルートディレクトリエントリを確認。
- ディレクトリエントリが並んでおり、作成したtest.txt、test2.txtが存在。
- ファイルの中身の情報はDIR_FstClusHIとDIR_FstClusLOで指定されたクラスタから特定。
- BPB_RootClusでルートディレクトリエントリのクラスタ番号から特定する。
バックナンバーはこちら。
コメント