最終更新日 1999年8月17日
ひとつ上に戻ろう
トップ・ページへ戻ろう
FAT FSは1977年来DISK BASICから始まり、 以後MS-DOS、WindowsへとMicrosoft社の製品でサポートされ続けているファイルシステムだ。 またMicrosoft社の製品の市場占有率のため、他のOSでも多く対応されている。 なお、このページは「SUPER ASCII 1997年2月号」を参考文献とした。
FAT FSは、ディスク領域をクラスタ単位で分け、そのクラスタに番号を割り付け管理する。
MS-DOSの初期では、その番号の大きさが12bitで、
2^12=4096個(実際は4085(FFF5h)個)のクラスタを管理することができた。
しかし、クラスタサイズは最大で32KBなので、32KB*4096=128MBまでの容量しか対応できない。
(FAT12)
なので、(MS-DOS ver. 3.xのことはちょいと飛ばして)
MS-DOS ver. 4.xではクラスタエントリの値を16bit、
65536個(これまた実際は65525(FFF5h)個)まで拡張して、
最大32KB*65536=2GBの容量まで対応できるようにした。(FAT16)
だが、ディスクの容量は増え、2GBを越えるものも珍しくなくなってきた。
もちろんパーティションを切ればいいのだが、2GBのパーティションというのも窮屈で(末恐ろしいものだ)、
それだけではなくパーティションを1GB以上で切ると、
クラスタサイズは32KBになり(512MB以上1GB未満でも16KBだ)、
どんなに小さなファイルでも最低32KB領域を消費してしまう。
このことを回避するため、Windows 95 OSR2から、ディレクトリエントリが32bitに拡張された。
が、実際は28bitしか使われておらず、管理するクラスタ数も268435445(FFFFFF5h)個である。
(FAT32)
ここではVFAT32を中心に書く。
Windows 95では、それまでのMS-DOSのFAT FSとの互換を取りつつ、 拡張したVFATが使われている。そのため、ディレクトリエントリの予約領域の一部が、 作成時刻やアクセス日付の情報保存に割り当てられたが、 残された2Byte分がFAT32の実装に使われた。
ディレクトリエントリ | |||||||||||||||
00 | 08 | 0B | 0C | 0D | 0E | ||||||||||
ファイル名(左詰め、余りは20h) | 拡張子 | ファイル 属性 |
大小文字 フラグ |
(VFAT) | 作成時刻 (VFAT) |
||||||||||
10 | 12 | 14 | 16 | 18 | 1A | 1C | |||||||||
作成日付 (VFAT) |
アクセス日付 (VFAT) |
クラスタ番号 上位2Byte |
更新時刻 | 更新日付 | クラスタ番号 下位2Byte |
ファイルサイズ | |||||||||
サブディレクトリエントリ (VFAT) | |||||||||||||||
00 | 01 | 0B | 0C | 0D | 0E | ||||||||||
ID | Unicode ファイル名1 | 0Fh固定 | 00h固定 | ショートネームの チェックサム |
Unicode ファイル名2 |
||||||||||
10 | 1A | 1C | |||||||||||||
Unicode ファイル名2(続き) | 0000h固定 | Unicode ファイル名3 |
よくわからんが、最大2TB/パーティション。
FAT32では、デフォルトで4KBytesに設定され、 1TByte以下までは4KByteのままでよい。
FAT16のディレクトリエントリは、最大でも64K個程度であるが、FAT32だと512K個程度となり、
ディスクアクセスの低下を招く。そのため、以下のような仕組みが追加されている。
FSINFOのイメージ
0000 | 52 | 52 | 61 | 41 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 55 | AA |
0010 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 55 | AA |
...... | ||||||||||||||||
bfFSinf_Sig | 空きクラスタ数 | 最終書き込み クラスタ番号 |
||||||||||||||
01E0 | 00 | 00 | 00 | 00 | 72 | 72 | 41 | 61 | FF | FF | FF | FF | 02 | 00 | 00 | 00 |
01F0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 55 | AA |
FSINFOBIGFATBOOTFSINFO)の構造
オフセット | フィールド名 | サイズ(Byte) | 内容 |
00h | bfFSinf_Sig | 4 | 0x61417272L "rrAs"固定 |
04h | bfFSinf_free_clus_cnt | 4 | 空きクラスタ数 |
08h | bfFSinf_next_free_clus | 4 | 最終書きこみクラスタ番号 |
0Ch | bfFSinf_resvd | 12 | 予約領域 |
MS-DOS 3.xから、DPBには最終書き込みクラスタ番号が保存されており、
最後に書き込んだクラスタ以降にデータを書き込むことができる。
なので、デフラグメンテーションが適切に実行されていれば、フラグメントを抑制させる効果がある。
また、最後の書き込んだクラスタよりFATを検索することにより、ディスクアクセスを局所化し、
キャッシュを有効利用する効果もある。
FAT32からはFINFOにも最終書き込みクラスタ番号が保存され、起動直後でもこの値を利用できる。
また、この値はディスクリセット(ファンクション0Dh)の影響を受けない。