富士通エレクトロニクス

サイトマップ

Japan

ホーム | English

印刷用

元のページへ戻る

  1. ホーム >
  2. 製品 & サービス >
  3. 自社製品 >
  4. 組込み用ファイルシステム >
  5. FATファイルシステム

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の構成
図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チェイン