FATについて3 FATについて FATについて2 ホームページに戻る
FATファイルの読み出しは、FATについて・FATについて2で説明しましたが、今回はルートディレクトリへの
書き込みについてまとめ、FAT16の仕様についておさらいしてみました。
1つのファイルの構成
1つのファイルは次の3つ部分から構成される。
T
FAT領域:データ領域を示すポインタ(FAT)のある領域、通常2組ある
U
ディレクトリエントリ領域:ファイル属性(名前・作成日時・サイズ・データ開始FAT番号等)
V データ領域:ファイルの中身、FAT(クラスタ)で示された領域
T FAT
FATは、2バイト(16ビット)1組みでその値がある場所がFAT番号であり、その値が次のFAT番号を指しており、値が’FFFF’で終了
上の例では、FATの2番から4番まで連続したファイルと、5番のみで終わるファイルが存在することになる。(0と1番はシステムで使用)
また、6番目以降のFATは未使用である。
ファイルの先頭を示すFAT番号は、ディレクトリエントリの27:26バイト目で示される。(FAT16の場合)
U
ディレクトリエントリ
エントリ1 エントリ2 エントリ3
エントリ4 ・・・・・ エントリn
*基本エントリは32バイト(詳細はFATについて参照) *注 拡張エントリは異なる
*ファイル名の0バイト目は特別の意味があり、00h:空き・E5h:削除済み 使用可能なエントリである(FATについて2参照)
基本エントリのファイル名は、MSDOSの規格に合わせる必要がある。(英字小文字不可等)
V
データ
データはFATにより管理され、FAT番号からセクタ(アドレス)が決まる。
FAT番号Fとクラスタ番号Cの関係はC=F−2でありクラスタの示すデータ領域の先頭クラスタAは A=Sc+C×Cpc となる
Sc:データ領域の先頭セクタ、Cpc:1クラスタ当たりのセクタ数
上記のFAT番号2から始まるファイルの場合、先頭はSc+0セクタとなり ∵Sc+(2−2)×Cpc
Cpcが4の場合、FAT番号2に対応するのがSc+0〜3セクタ、FAT番号3に対応するのがSc+4〜7セクタ、FAT番号4に対応するのが
Sc+8〜11セクタ(途中まで使用)となる。
データの書き込み
@空きFATの検索
FAT領域を読み込み、空きFATを探す。(読み書きは、1セクタ単位)
上記の例では、6番目のFAT(12・13バイト)が最初の空きなのでそこを使用するため、その値を
’FFFF’とする。 1クラスタ分以内(Cpc×512バイト)のデータであればこれで完了、これを越えたら
次の空きFATを探し、そのFAT番号に書き換える。
AFATデータの書き込み
@の内容でセクタデータを書き込む。2組目のFATも同じ内容を書き込む
B空ディレクトリエントリの検索
ルートディレクトリエントリ領域を検索し、空きまたは削除されたエントリを見つける。
この段階では、使えるエントリがあることが確認できればよい。(仮の値を書き込んでもよい)
Cデータの書き込み
FAT番号から計算した、データ領域にデータを書き込む。
1クラスタ(Cpcセクタ)分を書き込んだら、@により次の空きFATを検索し空きデータ領域に続きを書く。
書き込んだデータのバイト数はカウントしておく。
Dエントリの書き込み
Bの空きエントリに、必要なエントリデータを書き込む。
書き込み例(Disk
Investigatorによる表示)
64MBSDカード 2セクタ/クラスタ、セクタ長512バイト
FAT 開始セクタ:4(2組目 246) 容量:242セクタ×2組
リートディレクトリエントリ 開始セクタ:488 容量:32セクタ(32バイト×512エントリ/512(バイト/セクタ))
データ開始セクタ 520
FAT(No4セクタ)
FAT番号2から5まで、1クラスタづつ使用するファイルがある。
リートディレクトリエントリ(No488セクタ)
1番目のエントリ(00h-19h)はボリュームラベルとして使用 ボリューム名”GPS_LOG”
2番目のエントリ(20h-39h)はファイル”080040.LOG”用、ファイルデータのスタートFAT番号は0002hで、クラスタ
番号は2−2=0となり、520+2×0=520がスタートセクタとなる。ファイルサイズは330(014Ah)バイトである。
データ(No520セクタ)
ファイル”080040.LOG”のデータ