バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのファイル上シミュレーションの話。
ディスクイメージを読み解く。
今回はルートディレクトリエントリの内容を見てみる。
登場人物
博識フクロウのフクさん
![指差しフクロウ](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
ルートディレクトリエントリの位置
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
前回、いろいろ情報を書きか詰めた結果、
1152セクタ目からルートディレクトリエントリが始まってることがわかった。
1152[セクタ]*512[byte/セクタ]=589824[byte]=0x90000[byte]
というわけで、ディスクイメージの0x90000[byte]目を参照しれば良いってことか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
その通り。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
じゃーさっそく見てみよう。
ルートディレクトリエントリ参照
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
こんな感じだな。
![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)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
ディレクトリエントリは32byteで1個のデータで
画像にはtest.txtとtest2.txtのエントリが存在しているのが分かる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
そういえば、test.txtとtest2.txtってファイルを作ったんだっけか。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
そして、
test.txtは7000byteを書き込んで、
test2.txtには8000byteを書き込んだから、
サイズも一致してるね。
ファイルの中身の情報は?
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
で、実際のファイルの中身の情報はどこにあるんだ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
DIR_FstClusHIとDIR_FstClusLOに先頭クラスタ位置が埋まってるんで、そこから特定する感じだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
クラスタって複数のセクタを一まとめにした読み書き単位だっけ?
今回の場合だと確か、8セクタで1クラスタって情報が埋まってたから
4096[byte]が1クラスタか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
そうそう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
そして、DIR_FstClusHIとDIR_FstClusLOで指定されたクラスタが、
そのファイルの中身の情報を記録しているところってことか。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
名前的にはDIR_FstClusHIが上位16bit、DIR_FstClusLOが下位16bitになってるのかな?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
それも正解。
今回のtest.txtの場合だと、
DIR_FstClusHI=0x0000
DIR_FstClusLO=0x0003
なので、3クラスタ目からが該当ファイルの中身の情報が記録されてる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
3クラスタ目って具体的にはどこになるの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.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)
今回の場合、
ルートディレクトリエントリはクラスタ2になるね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
その情報はどこで????
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
実はBPB(BIOS Parameter Block)に埋まってる情報で。
BPB(BIOS Parameter Block)を読み出した回の時も重要パラメータとして紹介はしてる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
あ!
ほんとだ!
BPB_RootClusが2ってことで、
ルートディレクトリエントリのクラスタが2ってことになるか!
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
でもなんで2?
0とか1とかじゃなくて?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
内容を入力してください。理由ははっきりしてないのだが、
昔からクラスタ2を先頭クラスタとしていたようだ。
処理系によっては、クラスタ2が先頭クラスタであることを前提に作られてる場合もあり得るらしいので、
クラスタ2にしておいた方が無難ってとこだな。理由ははっきりしてないのだが、
昔からクラスタ2を先頭クラスタとしていたようだ。
処理系によっては、クラスタ2が先頭クラスタであることを前提に作られてる場合もあり得るらしいので、
クラスタ2にしておいた方が無難ってとこだな。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
うーん。
まぁFAT自体がそうとう歴史が長そうだからなー。
そういうのもあるのかー。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
というわけで次回はファイルの中身のデータを参照してみよう。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- ルートディレクトリエントリを確認。
- ディレクトリエントリが並んでおり、作成したtest.txt、test2.txtが存在。
- ファイルの中身の情報はDIR_FstClusHIとDIR_FstClusLOで指定されたクラスタから特定。
- BPB_RootClusでルートディレクトリエントリのクラスタ番号から特定する。
バックナンバーはこちら。
コメント