FATファイルシステム(その2)

FATファイルシステムの構造(続き)


 

FAT(File Allocation Table)


FATは、BPBに続く領域に配置されている。FATが存在するセクタ番号は次のように計算することができる。

FirstFATSector = 1st_sector + BPB_RsvdSecCnt

FATは複数個存在する場合、2個目のFATが存在するセクタは

FirstFATSector + BPB_FATSz16

で計算することができる。

FATの例

 

FAT16では、上の例のように16bit(2バイト)で一つの要素になっていて、ユーザファイルの場所(クラスタ番号)を示す連結リストになっている。

 

RDEとFAT

RDEのFstClusLO(クラスタ番号)は、ファイルの先頭が存在するクラスタ番号を示しており、上の例では0x0002である。これは、ファイルの先頭がクラスタ2に存在することを示している。

FATテーブルのクラスタ2には、0x0003と記録されている。これはファイルの続きがクラスタ3に存在することを示している。

同様にFATの連結リストをたどっていくと、クラスタ5の0xffffに出会う。0xffffは連結リストの終了を意味している。

よって、上の例ではSAMPLE.TXTの格納場所はクラスタ2→クラスタ3→クラスタ4→クラスタ5の順に、4つのクラスタに分かれていることになる。

※クラスタ0とクラスタ1は使われていない。ユーザデータ領域はクラスタ2が先頭になるので注意が必要である。

 

ユーザデータ


ユーザデータはRDEに続く領域に位置していて、先頭セクタは次のように計算することができる。

FirstDataSector = FirstRDESector + ( 32 * BPB_RootEntCnt ) / BPB_BytesPerSec

ここで、32は1エントリあたりのバイト数、BPB_RootEntCntはRDEにエントリ可能なファイルやディレクトリの数であるから、32 * BPB_RootEntCntはRDEのサイズ(バイト)である。

これをBPB_BytesPerSec(セクタあたりのバイト数)で割ると、BPBに必要なセクタ数になる。

 

ユーザデータは、セクタではなく、クラスタ単位で管理されている。BPB_SecPerClusは1クラスタあたりのセクタ数である。例えばBPB_SecPerClus = 2であれば、1クラスタあたり2セクタである。

 

ユーザデータ領域の先頭はクラスタ2であり、クラスタ0とクラスタ1は存在しない。

クラスタ2の先頭セクタは上で計算した値(FirstDataSector)であり、クラスタ3の先頭セクタはFirstDataSector + BPB_SecPerClusである。

クラスタNの先頭セクタは

FirstSectorofCluster = ((N – 2) * BPB_SecPerClus) + FirstDataSector

で計算することができる。

 

FATの例(複数のファイル)


複数のファイルが存在する場合のRDEとFATを次に示す。

RDEの例

 

FATの例

この例ではFILE1.TXT, FILE2.TXT, FILE3.TXT, FILE4.TXTの4つのファイルが存在している。

 

RDEとFATの抜粋

RDEによると、FILE1.TXTはクラスタ2に存在している。FATによると、クラスタ2に続くクラスタは無い。よって、FILE1.TXTはクラスタ2に全て格納されている。

クラスタ2は512*2バイトであるが、全てを使用しているのではない。RDEのFileSize分だけが有効なデータとして使われていて、クラスタの残りの部分は空きになっている。

 

同様に、FILE4.TXTはクラスタ6に存在している。FATによると、クラスタ6の次はクラスタ7、クラスタ7の次はクラスタ8、クラスタ8の次はクラスタ9となっている。クラスタ9はクラスタチェーンの最後である。よって、FILE4.TXTはクラスタ6→クラスタ7→クラスタ8→クラスタ9の4つのクラスタに記録されている。

 

FATの例(ファイル削除)


ファイルを削除した場合のRDEとFATの変化は以下のようである。

削除前のRDE

削除前のFAT

この状態で、FILE3.TXTを削除する。FILE3.TXTはクラスタ4→クラスタ5に存在しているファイルである。

 

削除後のRDE



削除により、RDEのFILE3.TXTのエントリ部分のファイル名の先頭の1文字が0xe5に変化している。ファイル名の先頭が0xe5のとき、このエントリは無効であると判断され、ファイルがルートディレクトリから消える。

 

削除後のFAT

削除により、FILE3.TXTが使用していたクラスタ4とクラスタ5のFATは0x0000となり、クラスタは未使用となる。

このように、ファイルを削除する場合は、データ自体を消去するのではなく、ディレクトリエントリのファイル名に未使用のマークをし、FATテーブルの該当部分を解放するだけである。

 

演習


次のワークスペースを使い、演習を行う。

fat2.zip

演習1:BPBからBPB_BytesPerSec, BPB_SecPerClus, BPB_RsvdSecCnt, BPB_NumFATs, BPB_RootEntCnt, BPB_FATSz16の各パラメータを抜き出し、表示するプログラムを作成せよ。

 

演習2:RDEの先頭に登録されているファイルの、ファイル名、拡張子、属性、作成時刻、作成日時、クラスタ番号、ファイルサイズを抜き出し、表示するプログラムを作成せよ。

作成時刻と作成日時は、xx時xx分xx秒、xxxx年xx月xx日のように表示すること。

 

演習3:FATを読み、RDEに登録されているファイルのデータが記録されているクラスタ番号を表示するプログラムを作成せよ。

RDEに登録されているファイルそれぞれについて、クラスタ番号を表示する。複数のクラスタが使われている場合は、クラスタチェーンをたどり、すべてのクラスタ番号を表示する。

 

演習4:SDカードに書き込まれている”SAMPLE.TXT”の内容を表示するプログラムを作成せよ。

RDEから得たファイルサイズ分だけ表示すること。

 

Copyright © 2012-2019 ミームス(MEMEs)のサポートページ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.