eFILE(組込み用ファイルシステム)
FATファイルシステムの概要
FATファイルシステムは、MS-DOS/Windowsに採用されており、最近ではPCと互換性を保つため、メモリカードなどで一般的に利用されているフォーマットです。
このFATのディスクフォーマットは、JIS X0605-1990の「情報交換用フレキシブルディスクカートリッジのボリューム及びファイル構成」にて規格化されています。
フレキシブルディスクは、馴染み深いフロッピィディスクと同義語で、このフロッピィディスクに対するファイルの記録フォーマットを規定した規格となります。
FATファイルシステムの概要
FATファイルシステムは大きく分けて、FAT12、FAT16、FAT32の3つの種類が存在します。
この他にVFATと呼ばれるものがありますが、これはロングファイル名を扱えるようにディレクトリエントリーの構造を拡張した仕様です。
WindowsではFATファイルシステムと言えば、FAT12、FAT16、FAT32、VFAT全てをサポートしたファイルシステムを意味しますが、組込み機器の世界では、単にFATファイルシステムと言った場合には、FAT12とFAT16のみのサポートである場合が多く、FAT32、VFATに対応しているものは、「FAT32対応」、「VFAT対応」等、別途明記されている場合が多いので注意が必要です。
ここでは、FAT12、FAT16を中心に説明いたします。
図1に、フロッピィディスク(1.44Mbyte)の場合のFAT構造を示します。
セクタ番号の若い数値より、BPB(ブートセクタ)、FAT(FAT1, FAT2)、ルートディレクトリ、データ 領域と全体の領域が分類されます。
図1 FATの構成

eFILE(組込み用ファイルシステム)
ブートセクタについて
図2にブートセクタの内容を示します。
ブートセクタは、ディスクの構成を示すBPB(BIOSパラメーターブロック)とOSをロード起動するためのブートプログラム領域があります。
ブートブログラム領域は、86系CPUコードが記録されているため、eFILEでは使用しません。
| 位置(バイト) | サイズ | 内容 |
| 0x00~0x02 | 3バイト | ジャンプコード |
| 0x03~0x0A | 8バイト | 名称 |
| 0x0B~0x0C | 2バイト | 1セクタ当たりのバイト数 |
| 0x0D | 1バイト | 1クラスタ当たりのセクタ数 |
| 0x0E~0x0F | 2バイト | 予約セクタ数 |
| 0x10 | 1バイト | FAT数 |
| 0x11~0x12 | 2バイト | ディレクトリエントリー数 |
| 0x13~0x14 | 2バイト | 総セクタ数 |
| 0x15 | 1バイト | メディアディスクリプタ |
| 0x16~0x17 | 2バイト | 1FAT当たりのセクタ数 |
| 0x18~0x19 | 2バイト | 1トラック当たりのセクタ数 |
| 0x1A~0x1B | 2バイト | ヘッド数 |
| 0x1C~0x1F | 4バイト | 隠されたセクタ数 |
| 0x20~0x23 | 4バイト | 大容量ディスクの総セクタ数 |
| 0x24 | 1バイト | 物理ドライブ番号 |
| 0x25 | 1バイト | 予約 |
| 0x26 | 1バイト | 拡張ブートレコードシグネチャ |
| 0x27~0x2A | 4バイト | ボリュームシリアル番号 |
| 0x2B~0x35 | 11バイト | ボリュームラベル |
| 0x36~0x3D | 8バイト | FATタイプ |
| 0x3E~0xFD | 448バイト | ブートプログラム領域 |
| 0x1FE~0x1FF | 2バイト | ブートレコードシグネチャ |
(1)ジャンプコード
(2)名称
(3)1セクタ当たりのバイト数
(4)1クラスタ当たりのセクタ数
(5)予約セクタ数
(6)FAT数
(7)ディレクトリエントリー数
(8)総セクタ数
(9)メディアディスクリプタ
(10)1FAT当たりのセクタ数
(11)1トラック当たりのセクタ数
(12)ヘッド数
(13)隠されたセクタ数
(14)大容量ディスクの総セクタ数
(15)物理ドライブ番号
(16)予約
(17)拡張ブートシグネチャ
(18)ボリュームシリアル番号
(19)ボリュームラベル
(20)FATタイプ
(21)ブートプログラム領域
(22)ブートシグネチャ
(1)ジャンプコード
ブートセクタの先頭の3バイトはOSをロードするためのブートプログラムへのジャンプ命令が記録されます。
ジャンプコードは、86系CPUの命令コードで通常は、”EB”、”3E”、”90”が設定されています。
eFILEでは、このフィールドは使用していません。
(2)名称
このフィールドには、メーカー名や製品名などの文字列が記録されます。
eFILEでフォーマットした場合は、"EFILE"と記録されます。
(3)1セクタあたりのバイト数
このフィールドには、1セクタ当たりのバイト数が記録されます。
AT互換機では、512バイトのみが使用されています。
現在のPCはほとんどがAT互換機なのでWindowsも実質512バイト固定となっているのが現状です。
eFILEでは、512バイトのみ有効です。
(4)1クラスタあたりのセクタ数
このフィールドには、1クラスタ当たりのセクタ数が記録されます。
1,2,4,8,16,32,64のどれかの値が設定されています。
1クラスタは、複数のセクタで管理します。
この値が“4”であれば、4セクタ(2KB)を1クラスタとしてデータ領域を管理することになります。
(5)予約セクタ数
このフィールドには、ブートレコードで使用しているセクタ数が記録されます。
通常は、”1”が設定されています。
(6)FAT数
このフィールドには、FATの数が記録されており、通常”2”が設定されています。
FATは2個持っているのが普通です。
RAMディスク等では容量がもったいないという理由からFATを1つしか持たないディスクも存在しましたが、SDカード、メモリースティック、ハードディスク等外部記憶装置では、FATは必ず2個記録されています。
(7)ディレクトリエントリー数
このフィールドには、ルートディレクトリとして使われるディレクトリの数が記録されます。
ディレクトリエントリーは1エントリーで32バイト使用されます。
従って、1セクタには16個のディレクトリエントリーが記録できます。
ディレクトリエントリー数の最大は512個なので、ルートディレクトリには、最大で512個のファイルを作成できます。
(8)総セクタ数
このフィールドには、ディスクの全セクタ数が記録されます。
このフィールドは2バイトなので、最大65535セクタ(32MB)の容量まで扱うことができます。
32MBを超える容量のディスクを扱う場合は、(14)の大容量ディスクの総セクタ数に全セクタ数が記録されます。
その場合、このフィールドには0が設定されます。
(9)メディアディスクリプタ
このフィールドには、通常”0xF8”が記録されます。
メディアがフロッピィディスクの場合は”0xF0”を設定しますが、その他のメディアでは、 ”0xF8”を設定するのが普通です。
メディアディスクリプタとFATの先頭にあるFATIDは、同じ値になっています。
(10)1FAT当たりのセクタ数
このフィールドには、1つのFATが使用しているセクタ数が記録されます。
(11)1トラック当たりのセクタ数
このフィールドには、ディスクの物理的な1トラックのセクタ数が記録されます。
論理セクタ番号から物理的なセクタ位置を計算する際に必要となる値です。
このフィールドは、MS-DOSのディスクドライバで使用されていましたが、Windowsでは使用していないようです。(Windowsでは、このフィールドに”0”を設定しても動作します)
Windowsのファイルシステムは、メディアがディスクの場合、論理セクタ番号から物理的なセクタ位置(シリンダ、ヘッド、セクタ位置)への変換は、ドライバで行うのが一般的となっているためと思われます。
また、SDカードやメモリスティック等では、そもそもトラックやヘッドが存在しないため意味がありません。
eFILEでも、ドライバへは論理セクタ番号を渡すため、このフィールドは使用していません。
(12)ヘッド数
このフィールドには、ディスクの物理的なヘッドの数が記録されます。
これも(11)と同様に、論理セクタ番号から物理的なセクタ位置を計算する際に必要となる値です。
このフィールドも、MS-DOSのディスクドライバで使用されていましたが、Windowsでは使用していないようです。(Windowsでは、このフィールドに”0”を設定しても動作します)
eFILEでも、このフィールドは使用していません。
(13)隠されたセクタ数
このフィールドには、ブートセクタより前にあるセクタ数が記録されます。
ハードディスク等ではMBR(マスターブートレコード)を先頭のセクタに確保する場合があります。
その場合は、MBRで確保したセクタ数がこのフィールドに設定されます。
MBRにはパーティションの先頭セクタ番号が入っており、パーティションの位置はこの値で知ることができます。
このフィールドも、MS-DOSのディスクドライバで使用されていましたが、Windowsでは使用していないようです。(Windowsでは、このフィールドに”0”を設定しても動作します)
eFILEでも、このフィールドは使用していません。
また、eFILEではMBRが存在するデバイスに対しては、ドライバ側でパーティションの開始セクタ番号を取得し対処する必要があります。
(14)大容量ディスクの総セクタ数
このフィールドには、ディスクの容量が32MB以上のディスクの全セクタ数が記録されます。
32MB未満のディスクの全セクタ数は、(8)総セクタ数のフィールドに記録されます。
(15)物理ドライブ番号
このフィールドには、AT互換機用のブートセクタのブートプログラムが使用する物理的なドライブの番号が記録されます。
このフィールドも、Windowsでは使用していないようです。
eFILEでもこのフィールドは使用していません。
(16)予約
このフィールドには、常に”0x00”が記録されています。
(17)拡張ブートシグネチャ
このフィールドには、通常”0x29”が記録されており、この場合はこの後に (18)ボリュームシリアル番号、(19)ボリュームラベル、(20)FATタイプが存在します。
”0x00”が記録されている場合は、これらの情報は存在しないことを意味します。
(18)ボリュームシリアル番号
このフィールドには、フォーマット時に付けられた4バイトの値が記録されています。
(19)ボリュームラベル
このフィールドには、フォーマット時に付けられたボリュームラベルが記録されています。
(20)FATタイプ
このフィールドには、FATを識別する文字列が記録されます。
FAT12の場合は、文字列で"FAT12"と記録され、FAT16の場合は"FAT16"と記録され、FAT32の場合は、"FAT32"と記録されます。
(21)ブートプログラム領域
このフィールドには、86系CPUコードでブートプログラムが記録されます。
eFILEは、この領域は使用していません。
(22)ブートシグネチャ
このフィールドには、必ず、”0x55”,”0xAA”が記録されます。
ブートセクタかどうか、このシグネチャをチェックして、一致していればBPB情報の解析を行います。
eFILE(組込み用ファイルシステム)
クラスタについて
図3にクラスタ(データ領域の管理単位)について示します。
データ領域をセクタ単位で管理すると管理テーブルが大きくなるため、数セクタをまとめて1クラスタとして扱い、クラスタ番号を管理するテーブルにてファイル管理します。
また、1バイトのファイルでもクラスタ単位の管理上、1クラスタの領域を利用して管理します。
このため1クラスタの割り当てセクタ数が少ないと小さいファイルを数多く作成する事が可能ですが、管理テーブルが大きくなる傾向にあります。
このため、利用アプリケーションのファイルサイズやファイル数を考慮してクラスタに割り当てるセクタ数を決めると、効率よく情報を記録する事が可能です。
図3 クラスタについて(データ領域の管理単位)

クラスタ番号管理について
図4に、FATテーブル内のクラスタ番号管理について示します。
クラスタ番号の最大取り扱い値によって、3種類(FAT12,FAT16, FAT32)のFAT管理種別となります。
FAT12では、128MBまで管理可能で主にフロッピィディスクや低容量のメモリカードに利用されています。
FAT16では、2GBまで管理可能で大容量のメモリカード(32MB~1GB)で利用されています。
FAT32では、2TBまで管理可能でハードディスク等の大容量のディスクで利用されています。
図4 クラスタ番号
| クラスタ番号 | 番号の範囲 | 終端 | 欠陥クラスタ | |
| FAT12 | 12bit | 2~0xFF6 | 0xFF8~0xFFF | 0xFF7 |
| FAT16 | 16bit | 2~0xFFF6 | 0xFFF8~0xFFFF | 0xFFF7 |
| FAT32 | 32bit | 2~0xFFFFFF6 | 0xFFFFFF8~0xFFFFFFF | 0xFFFFFF7 |
クラスタ番号0は、空きを表す。
クラスタ番号は一般的にFATエントリーと呼ばれている。
eFILE(組込み用ファイルシステム)
FATチェインについて
図5FAT管理のFATチェインについて示します。
FAT領域は、フォーマット直後はファイルがありませんので、FATチェインが存在せず、予約箇所のみデータがあります。
ファイルが作成されるとクラスタ単位でFATチェインを作成し、利用していない箇所を順方向に検索しクラスタ番号のチェインを作成します。
ファイル削除や作成が頻発するとチェインが複雑に入乱れ、リンク検索に時間がかかるようになります。
Windowsでは、リンクチェインを順アクセス方向にきれいに並び換える最適化ツールがあります。
この最適化を実施するとリンク検索時間が短縮されファイルのリード/ライト性能が向上します。
図5 FATチェイン

