はじめに
ファイルシステムについて学び始めたばかりなので最近見かけない学びやすそうなFAT16
について勉強していったので自分用のメモとしてまとめました。
FATファイルシステムについて
FATファイルシステムは最初にMS-DOSでサポートされていたファイルシステムで様々なリムーバブルディスクで使用されているファイルシステムです。
FATというのはFile Allocation Tableの略称でディスク内でのファイルの位置、データの割り当てられた領域を管理するシステムのことを言います。
FAT12、FAT16、FAT32の数字はFAT領域で扱うデータ長のことです。
FATファイルシステムは情報が格納されている場所をセクタ番号で表します。
領域について
FATファイルシステムには基本的に下記のような3~4個の領域があります。
- 予約領域 ←今回はこの領域についての話です!
- FAT領域
- ルートディレクトリ領域(FAT32ではこの領域はありません)
- データ領域
※FATファイルシステムのデータ構造は全てリトルエンディアンです。
予約領域
最初のセクタに格納されているのは予約領域です。
予約領域にはBPB(BIOS Parameter Block)やブートストラップコード等が書かれています。
BPBにはセクタ長や1クラスタのセクタ数、各領域の開始位置などの値が格納されていて、各領域のサイズが計算できるようになっています。
この領域を見るときに注意することは、ブートシグネチャは予約領域の最後の2バイトが0xAA55なのではなく、オフセット0x01FEは0x55、0x01FFが0xAAと決まっていることです。
資料によっては、予約領域の最後の2バイトにブートシグネチャが格納されていると書かれていることがありますが、間違いなので注意してください。
1セクタに格納されるバイト数は互換性のために512バイトが推奨されていますが、ハードウェアによって、バイト数が512より大きい場合は1024、2048、4096のどれかになります。もし512バイトよりも、1セクタのバイト数が大きかったとしても、ブートシグネチャのオフセットは変わりません。
ですが、シグネチャが正しく設定されている場合には、終わり2バイトが0xAA55でも問題ありません。
フィールド名の先頭にBSが書かれているのはブートセクタ内のフィールド、BPBが表記されているものはBPB内のフィールドです。
FAT12/16とFAT32ではここから内容が変わっていきます。
参考資料
http://elm-chan.org/docs/fat.html
http://free.pjc.co.jp/fat/mem/fatm161.html