FAT
読み:ファット
外語:FAT: File Allocation Table
Microsoftが開発し、
MS-DOS
で普及し、後に
Microsoft Windows
で拡張を重ねて使用されている
ファイルシステム
(ディスク管理方法)の一つ。
目次
概要
由来
N-BASIC
86-DOS(QDOS)→MS-DOS
国際標準
特徴
構造
クラスター
種類
ディレクトリエントリ
機構
ファイルの属性
エントリの構造
MS-DOS
Windows NT以降
ロングファイル名
概要
由来
FATは、
ビル・ゲイツ
と、Microsoft初の給与従業員だったMarc B. McDonaldによって発案、開発されたファイルシステムである。
初期のものはクラスター番号を8ビットで表現しており、このためFAT8とも呼べるものだったが、当時も今も、そのような呼び方はしていなかったようである。
このシステムはMicrosoftのDisk BASICで採用され、日本でも、
PC-8000シリーズ
や
PC-8800シリーズ
などのDISK BAISCで採用されていた。
その後、クラスター番号長が10ビットや12ビットに拡張されたが、MS-DOS用として最初に導入されたものが12ビット長であり、これがFAT12として広く普及することになった。
N-BASIC
まだFATとは一般に呼ばれていなかった頃、
PC-8000シリーズ
や
PC-8800シリーズ
のDISK BAISCでこのファイルシステムは使われていた。
ファイルシステムとは直接関係がない話ではあるが、中でもPC-8001の
N-BASIC
の実装は、FAT情報をメモリーに置いており逐一ディスクに書き込まないことを特徴とした。ディスクを取り出す前にremoveをしてフラッシュする必要があり、これを忘れるとファイルシステムを破損した。不便だったため、88以降では不要になった。
86-DOS(QDOS)→MS-DOS
Tim Patersonが開発した86-DOS(QDOS)、これを買収して開発されたMS-DOSは、共にファイルシステムとしてFATを採用している。
86-DOS(QDOS)は
CP/M
を参考に開発されていたが、コード自体は完全なオリジナルでCP/Mからの流用はなかった。そしてファイルシステムは、CP/M互換ではなく、当時彼が使用していたBASIC-86との互換性のため、8ビットのFATを採用した。
そしてMS-DOS 1となったとき、12ビットのFATとして出荷されたのである。
国際標準
FAT12/FAT16の二種類は、ECMA-107およびISO/IEC 9293として国際標準となっている。日本語規格はJIS X 0605が相当する。
FATの特許等は当然Microsoftにある(あった)と思われるが、FAT12/FAT16については、広く普及はしたが特に特許料などは要求してこなかった。
2003(平成15)年頃には、FAT32やVFATなど、まだ特許件が残存していそうなものを根拠にしてか、ライセンス料を要求しようという話が出たこともある。その後どうなったかは不明。
特徴
構造
ディスクは、次の領域に分けられる。
ブートセクター
FAT1
FAT2
ルートディレクトリ
の
ディレクトリエントリ
データ領域
ディスク上の領域は、
クラスター
と呼ばれる単位で管理される。このクラスターのつながり状態(リンク情報)をFAT領域に記録することで、データ領域にある実際のデータがディスク上にどのように存在するのかを管理することができる。
クラスター
ディスクは
セクター
と呼ばれる単位で構成され、幾つかのセクターをまとめてクラスターとする。
ファイルシステムは、セクター単位ではなく、クラスター単位でディスクを管理するが、このクラスター番号を記憶するサイズ(
ビット
数)に、FATには幾つかの種類がある。
使用するビット数が多いほど、扱えるクラスター数が増え、大容量ディスクを効率良く管理することができる。
ビット数が多い分だけ管理できるクラスター数が増え、大容量ディスクが扱えることになるが、その分FAT情報領域が増えてディスク容量を消費してしまうため、媒体の容量に応じたビット数が使われる。
種類
クラスター番号長が増えるほど、管理可能な容量は増えていく。
FAT12
(主に
フロッピーディスク
で使う12ビットのFAT) 20
Miバイト
程度が最大。
FAT16
(10Miバイト以上のハードディスクで使われる16ビットのFAT) 1パーティションで2.1
Giバイト
程度が最大。
FAT32
(
Windows 95 OSR2
から採用された32ビットのFAT) 1パーティションで2
Tiバイト
程度が最大となるが、実装上の問題から32Giバイト程度が限度となる。
exFAT
(
Windows Vista
SP1から採用されたFAT) 1パーティションで16
Eiバイト
程度が最大となる。
ディレクトリエントリ
機構
ファイルの名称等の情報は全て「
ディレクトリエントリ
」に格納される。
サブディレクトリのディレクトリエントリはファイルと同様の管理が内部でされているが、ディレクトリエントリに「ディレクトリである」というフラグが付けられている。
FATにおける基本的な仕様は次の通り。
8.3形式の
ファイル名
CP/M互換の圧縮日時情報により最小誤差2秒 (2107年12月31日まで対応)
ファイルの属性
ファイルのサイズ
ファイルの開始クラスター
FATには、
2108年問題
が存在する。
ファイルの属性
ファイルの属性は、次の種類がある。
読み取り専用属性
(R)
隠し属性(H)
システム属性(S)
アーカイブ属性
(A)
ディレクトリ(D) (MS-DOS 2以降)
ボリューム ラベル
(V) (MS-DOS 2以降)
エントリの構造
MS-DOS
ディレクトリエントリは一つにつき32バイトであり、次の順に格納される。
ファイル名
(8バイト)
拡張子(3バイト)
ファイル属性(1バイト)
ビット7: 未使用(0)
ビット6: 未使用(0)
ビット5:
アーカイブ属性
ビット4: ディレクトリ属性
ビット3: ボリューム属性
ビット2: 隠し属性
ビット1: システム属性
ビット0:
読み取り専用属性
予約(10バイト)
作成時刻(2バイト)
作成日付(2バイト)
先頭クラスター(2バイト)
ファイルサイズ(4バイト)
この構造は、CP/Mの構造の上位互換である。
Windows NT以降で、予約領域が拡張されている。
Windows NT以降
Windows NT以降では、従来未使用だった領域に情報が書き込まれるようになった。
以下は、
Microsoft Extensible Firmware Initiative FAT32 File System Specification
による。
DIR_Name (短いファイル名)
ファイル名
(8バイト)
拡張子 (3バイト)
DIR_Attr (ファイル属性) (1バイト)
ビット7: 未使用(0)
ビット6: 未使用(0)
ビット5:
アーカイブ属性
ビット4: ディレクトリ属性
ビット3: ボリューム属性
ビット2: 隠し属性
ビット1: システム属性
ビット0:
読み取り専用属性
DIR_NTRes (Windows NT用予約) (1バイト)
常に0
DIR_CrtTimeTenth (ファイル作成ミリ秒) (1バイト)
DIR_CrtTime (ファイル作成時刻) (2バイト)
DIR_CrtDate (ファイル作成日付) (2バイト)
DIR_LstAccDate (ファイル最終アクセス日付) (2バイト)
DIR_FstClusHI (先頭クラスターHI) (2バイト)
DIR_WrtTime (最終更新時刻) (2バイト)
DIR_WrtDate (最終更新日付) (2バイト)
DIR_FstClusLO (先頭クラスターLO) (2バイト)
DIR_FileSize (ファイルサイズ) (4バイト)
日時関係は、次の仕様となる。
作成日時 (ミリ秒単位)
最終アクセス日 (日単位)
最終更新日時 (2秒単位)
最終アクセス日はDIR_LstAccDateに記録されるが、時刻は保存されない。但し書き込みをした場合、DIR_WrtTimeに時刻が書き込まれる。
なお、最終更新日時とされる情報は、旧来のシステム(MS-DOSの時代)にはファイル作成日として使われていた。
ロングファイル名
Windows 95
以降で対応した
ロングファイル名
も、同様に1つ以上のディレクトリエントリを用いて情報を記録する。
この旧来に対する拡張情報は、ファイル属性(R+H+S+V)とした特殊な領域に格納される。これは互換性を考慮した結果と思われる。
OSからは
VFAT
という仮想レイヤーを経由してアクセスされる。結果としてディスクがFATであれば、従来と互換性を保つために特殊な隠しファイルとしてファイル属性(R+H+S+V)としたものをディレクトリエントリに書き込む。
再検索