【FatFs】車載外部ストレージ その101【ファイル上シミュレーション⑧】

【FatFs】車載外部ストレージ その101【ファイル上シミュレーション⑧】 車載外部ストレージ

バックナンバーはこちら。
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;};ファイル名、ファイル属性、ファイルサイズ
フクさん
フクさん

ディレクトリエントリは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でルートディレクトリエントリのクラスタ番号から特定する。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました