FAT ファイルシステム(FFS)

FAT ファイルシステム(FFS)
2003.5.15
Copyright(C) NEWRAL CO.,Ltd
FATファイルシステム
2
FATファイルシステム
目次
1.はじめに ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3
2.概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3
3.FATファイルシステムの概要 ・・・・・・・・・・・・・・・・・・・・・・
1)FATファイルシステムのFAT構造の種類 ・・・・・・・・・・・・・・
2)FATファイルシステムのディスク構造概要 ・・・・・・・・・・・・・・
3)FATファイルシステムのデバイス管理方式概要 ・・・・・・・・・・・・
4
4
5
6
4.FATファイルシステムのファイル管理方式概要 ・・・・・・・・・・・・・・ 7
1)クラスタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7
2)ディレクトリとFAT ・・・・・・・・・・・・・・・・・・・・・・・・ 8
3)BPB ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9
4)仮想FAT8の例 ・・・・・・・・・・・・・・・・・・・・・・・・・・10
5.マルチタスク化で追加された内容 ・・・・・・・・・・・・・・・・・・・・・17
6.FAT12の詳細
・・・・・・・・・・・・・・・・・・・・・・・・・・・19
1)IPL領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・19
2)FAT領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・21
3)ディレクトリ領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・22
7.FAT16の詳細
・・・・・・・・・・・・・・・・・・・・・・・・・・・23
1)IPL領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・23
2)FAT領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・25
3)ディレクトリ領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・25
4)容量計算 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・25
5)MBR ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・25
8.FAT32の詳細
・・・・・・・・・・・・・・・・・・・・・・・・・・・27
1)IPL領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・27
2)FAT領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29
3)ディレクトリ領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・29
4)容量計算 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・30
5)FSINFO ・・・・・・・・・・・・・・・・・・・・・・・・・・・・30
9.VFAT ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31
1)概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31
2)VFATの例 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・32
3)ロングファイル名ディレクトリ ・・・・・・・・・・・・・・・・・・・・32
4)ショートファイル名ディレクトリのチェック値 ・・・・・・・・・・・・・33
5)VFATの問題点 ・・・・・・・・・・・・・・・・・・・・・・・・・・33
10.ソフトキャッシュについて ・・・・・・・・・・・・・・・・・・・・・・・35
1)キャッシュが必要な領域 ・・・・・・・・・・・・・・・・・・・・・・・35
2)MS−DOSやWINDOWSが努力していること ・・・・・・・・・・・36
3)ディレクトリ領域のキャッシュ ・・・・・・・・・・・・・・・・・・・・36
4)FATキャッシュ概要 ・・・・・・・・・・・・・・・・・・・・・・・・37
5)ディレクトリキャッシュ概要 ・・・・・・・・・・・・・・・・・・・・・37
3
FATファイルシステム
1.はじめに
本書は、米国 Microsoft 社の OS に実装されている FAT ファイルシステムについての解説書です。
本書中の MS-DOS、Windows は米国 Microsoft の登録商標です。
本書の著者に無断での本書全部または一部を転載、御社内以外への配布を禁じます。
2.概要
1981年以来、使われている FAT ファイルシステムは原則非公開ですが、その時々のエンジニ
アによってほぼ全ての内容が解析、解明されています。
しかし、FAT ファイルシステムの組み込みのための解説書は皆無な状態が今も続いています。
その最大の理由は、FAT ファイルシステム=MS-DOS と言えるほど FAT ファイルシステムは奥が
深いためです。
(DOS=Disk Operating System ですから当然といえば当然の結果です)
例えば、FAT ファイルシステムを実用レベルにするには、ソフトキャッシュが不可欠ですが、そ
のキャッシュ構造や規模の選定は大変にリスキーです。
現に Microsoft も MS-DOS4.xでは大変な過ちを犯しましたし、Windows では FD を快適に動作
させるに至っていません。
本書ではまず、FAT ファイルシステムの概要と、その発展途上で追加された重要な内容について解
説し、FAT12・16・32、VFAT の詳細を解説した後、最も単純なソフトキャッシュについて解説し
ます。
4
FATファイルシステム
3.FATファイルシステムの概要
FATファイルシステム(特にFAT16以前)については、一部の解説書や雑誌に紹介されてい
ます。
それらと内容は重複しますが、簡単にFATファイルシステムの概要について触れます。
1)FATファイルシステムのFAT構造の種類
MS−DOS V2.xが出た当時は、FATファイルシステムがOSの唯一のファイルシス
テムであったため、FAT(File Allocation Table)ファイルシステムという呼び方はあまりさ
れていませんでした。
当時ではCP/Mのファイルシステムに対しFATでディスクを管理する方式が特徴的でした
から、MS−DOSのファイルシステムをよく「FAT」と呼んでいました。
現在ではWindows自体でもNTFSのファイルシステムを有する場合がありますので、
明確に「FATファイルシステム」として区別されています。
実際にFATファイルシステムのFAT構造としてはFATに記録するデータ長で
FAT12
FAT16
FAT32
の3種類がリリースされています。
FAT12とFAT16については扱われる場面においては単に「FAT」と称されることが
あります。
FAT12とFAT16の区別は外目からはつきませんが、FAT12は現在ではフロッピー
ディスクと一部のスマートメディアに使われています。
厳密には単にFATで扱う数値が12・16・32Bitのバリエーションがあるというだけ
ですが、システム側の制御プログラムは大きく変わりますので、ここではFAT構造の違いと
しています。
5
FATファイルシステム
2)FATファイルシステムのディスク構造概要
FATファイルシステムのディスク構造には2種類あります。
特に名前付けがされているという記憶もないのでとりあえず、
「シングルパーティション」と
「マルチパーティション」という名前を付けてみました。
シングルパーティション
IPL
マルチパーティション
MBR
system
IPL
FAT
FAT
DIR
パーティショ
ンブロック開
始を意味する
DIR
データ
データ
IPL
<図1 ディスク構造概要>
FATファイルシステムのディスク構造の基本系は「シングルパーティション」そのもの
です。
構成される要素には、
<表1 ディスク構造構成要素>
IPL
Initial Program Loader の略で、BPB等(後述)と Boot
の一部が格納されます。
FAT
File Allocation Table の略で、クラスタ(後述)の使用
状況(リンク情報)が格納されます。
DIR
Directory(後述)の略でルートディレクトリが格納され
ます。
データ
各ファイルのデータとサブディレクトリが保存されます。
MBR(後述)は Master Boot Recode の略でパーティションの情報が格納されます。
MBRは厳密にはFATファイルシステムのディスク構造の要素ではありません。
なぜならば、MBRで管理されるパーティションはFAT以外のフォーマットが可能だから
です。
すなわちNTFSや、Linux等のフォーマットが可能です。
また、拡張パーティションを使用した場合はさらに少し構成が異なります。
6
FATファイルシステム
3)FATファイルシステムのデバイス管理方式概要
ここでは、FATファイルシステムでさまざまな記憶メディアをどのように効果的に管理、
運用しているかについて触れます。
FAT12、16、32のバリエーションを持ち、かつ、FD、HD、MO、CD.
.等の物
理的な違い、さらにはその容量等数え切れない程の差を持つ記憶媒体をFATファイルシステ
は1つのファイルシステムドライバで制御しています。
そのドライバ構造をかなり乱暴に表現すると図2の様になります。
ファイルシ
ステムドラ
イバー
<図2 Windowsドライバ構造の概念図>
FATファイルシステムドライバ
FDドライバ
IDEドライバ
FD
HD
SCSIドライバ
HD
この仕組みを可能にしているのは、ファイルシステムドライバがこれら記憶デバイス(FD
やHD等)をたった1種類の論理デバイスとする「抽象化」です。
すなわち、ファイルシステムドライバ上ではFDとかHDとかいった区別はなく、全て同種
のデバイスとして扱われています。
実際に図2の、FD、IDE、SCSIドライバに対するFATファイルシステムドライバ
からの要求は全て同じ形式、同じ手順で行われています。
そしてFD、IDE、SCSIの各ドライバがそれぞれのデバイスを制御できる形式や手順
に変換して要求が処理されていきます。
この抽象化を可能にするのがIPL部に刻まれたBPB(Bios Parameter Block)です。
BPBにはFATの開始位置やDIRの開始位置、データの開始位置とそれぞれの大きさが
計算によって導き出せるための情報が入っています。
ファイルシステムはこのBPBを最初に取得し、デバイスを抽象化して制御します。
FAT12、16、32といった差分も実際にはFATを直接操作する部分だけが異なり、
その他のFATの制御アルゴリズムはどれも同じです。
ここで1つの疑問が生じるかと思います。
「確かにHDはIDEやSCSI対応であればどれでも使えるが、FDはそうではない」
これはPCのハードウエアの分解点の違いでこのような問題が引き起こされています。
<図3 デバイスの差>
PC マザー
コントローラ
コントローラ
& HD 部
FD
7
FDのようにコントローラが
PC本体に内蔵されるデバイス
では対応できるメディアに限界
がでます。
FATファイルシステム
その最大の理由はBPBにはデバイスを抽象化するのに必要な最小限のファクターのみが
あるだけで、記録密度や変調方式等のメディア固有の情報が含まれていないためです。
また3.1)で「システム側は大きく変わる」といったのは、FAT32についての差分は
それなりに大きいという意味です。
4.FATファイルシステムのファイル管理方式概要
FATファイルシステムは先の3.2)でも述べた様にIPL、FAT、DIR、データの4つの要
素で構成されます。
内、IPLは3.2)で述べた様にシステムBootとFATファイルシステムの最初のBPB取得
に利用される以外はあまり利用されません。
(ただ、大事な機能も担っています。これについては後述します)
DIRもFAT32では無くなりました。
DIRはルートディレクトリの保管領域で、FAT32まではこの領域が必要であったためルートデ
ィレクトリ内のファイル総数に制約がありました。
FAT32ではルートディレクトリをデータ領域の任意の場所に通常フォルダとして格納できる様に
なったため、ルートディレクトリ内のファイル総数に実質的な制限はなくなりました。
(ルート以外のフォルダは元々データ領域に置けますから、当たり前の進化と言えます)
この様に考えると、FATファイルシステムの基本はFATとデータ(特にディレクトリとして利用
される部分)の2つの構成要素の特質を理解すればいいことになります。
概要を説明するに当たって、1つ困難な問題があります。
それは、ディレクトリの構成内容やFATの構成内容がFAT12、16、32で微妙に違いがある
ことです。
各々の詳細は後述しますので、ここでは仮想の「FATx」として概要を説明します。
1)クラスタ
FATファイルシステムでは、先に述べた様に全ての対象デバイスを抽象化された論理デバイス
として扱います。
FATファイルシステムの対象デバイスは通常、回転を伴う磁気や光学メディアを対象とします。
これらのメディアはシリンダーの集合としてフォーマットされ、シリンダーは一つ以上のセクタ
から構成されます。
HDディスクやFDではこのシリンダーは同心円上に構成されていますが、MOやCD、DVD
ではスパイラル状になっています。
(Windowsのワープロでこれを図式化するのは最も困難なため省略します、バームクーヘ
ンと「なると」を想像してください)
セクタ長は128、256、512、1024…とさまざまですが、Windows上では原則
512バイトで扱われます。
(NT系では128、256、512が使用できますがWin9xは512のみサポートされて
います。 1024は512 x2としてなら処理が可能です)
8
FATファイルシステム
しかし、実際にセクタサイズの512バイトを記憶領域の最小サイズとしてしまうと、
FAT12
4096個 ≒
FAT16
65536個 ≒
FAT32 4294967296個 ≒
2M
32M
2048G
とFAT32以外は実際には使い物になりません。
そのため数セクタから数十セクタ単位で論理化できるように「クラスタ」という論理サイズが導
入されています。
FAT12では元々FDの物理容量の限界が1M程度なのでクラスタとセクタサイズは一致して
います。
CD等はセクタサイズは2048バイト程度ですが、このセクタサイズでは直接扱われません。
セクタサイズを512バイトとしてWindowsに合わせ、クラスタサイズを2048バイト
にする等の処置がとられています。
MOは512Mまではセクタ長は512バイトですが、640Mではセクタサイズは1024バ
イトになります。
このため640Mが出た当初、Win98等では多くの問題が発生しました。
ユニークな記憶媒体を新規に開発する場合は、この辺の考慮も必要となります。
2)ディレクトリとFAT
FATファイルシステムでは、扱うデバイスを連続してクラスタが並ぶ論理デバイスとして抽象化
します。
FATファイルシステムの唯一の目的は、そのクラスタを使ってファイルを構成、管理すること
です。
<図4 主要ディレクトリ情報>
ファイル名(8Byte)
拡張子
(3Byte)
属性
(1Byte)
ファイルには必ずディレクトリ情報が与えられます。
ディレクトリは32バイト構成で、
「属性」により、
・通常ファイル
・サブフォルダ
・ボリューム名
リザーブ (10Byte)
の形態をとりますが、ディレクトリの構成要素は同じ
です。
日付
「開始クラスタ」には、そのファイルが格納されている
先頭論理クラスタ番号が格納されます。
(4Byte)
開始クラスタ(2Byte)
サイズ
「サイズ」には、そのファイルの総バイト長が格納され
ます。
これで最終クラスタの有効バイト数もわかります。
(4Byte)
9
FATファイルシステム
FATには、論理クラスタのリンクが構成されます。
3)BPB(Bios Parameter Block)
BPBはFAT12、FAT16、FAT32ではその構成も違い、最も混乱する要素です。
L
セクタ長
論理セクタ長をバイトで表したものです
(2Byte)
H
クラスタ/セクタ
1クラスタあたりの論理セクタ数
(1Byte)
L
1面目のFATが開始される論理セクタ番号
FAT 開始セクタ番号 (2Byte)
H
FAT 面数
(1Byte)
総ルートディレクトリ数
(2Byte)
FAT面数(メインとコピー等複数面持つ場合があります)
L
H
L
ルートディレクトリ数
これでルートディレクトリに必要な論理セクタ数が決まります
総論理セクタ数 (2Byte)
H
メディアディスクリプタ
(1Byte)
FAT1 面に必要な
L
セクタ数
(2Byte)
H
L
トラック/セクタ
(2Byte)
H
L
ヘッド数
(2Byte)
H
L
不可視セクタ数 (2Byte)
H
メディアIDを格納します。
(後述)
FATに使うセクタ数を格納します。
総クラスタ数に必要な分に満たない場合はクラッシュします
FD用のパラメータですが今は適当な値が入っています。
物理ヘッド数と一致させる必要はありません
予約されたセクタ数(ドライバで使用)
<図5 BPB:19バイト>
注:standerd BPBと言われるものは、
「FAT1面に必要なセクタ数」までです
が、最近はその境界を意識する必要もなく、上記範囲を便箋上BPBとしました。
部です。
10
FATファイルシステム
4)仮想FAT8の例
ここでは説明しやすい様に仮想的にFATxをさらに具体的にした、FAT8を勝手に作って
例を紹介します。
(FAT8は実在しない構成です)
BPB
セクタ長
クラスタ/セクタ
FAT 開始セクタ番号
FAT 面数
総ルートディレクトリ数
総論理セクタ数
メディアディスクリプタ
FAT1 面に必要なセクタ数
トラック/セクタ
ヘッド数
不可視セクタ数
32
1
1
1
2
11
0xF8
1
2
1
1
ファイル構成は
ファイル名
属性
フォルダ
サイズ
使用クラスタ
ABC
通常ファイル
¥
70バイト
2、3、4
DEF
サブディレクトリ ¥
0バイト
7
GHI
通常ファイル
¥DEF
3バイト
5
この場合の論理セクタの状態を先のBPBと照らし合わせてみると、
論理セクタ
0
IPL
1
FAT
2
クラスタ
0
<図6 論理セクタイメージ>
1
2
DIR
3
3
4
論理クラスタ2
4
5
論理クラスタ3
5
6
論理クラスタ4
6
7
論理クラスタ5
7
8
論理クラスタ6
(空き)
論理クラスタ7
8
論理クラスタ8
(空き)
10
9
10
・
9
11
BPB
セクタ長
クラスタ/セクタ
FAT 開始セクタ番号
FAT 面数
総ルートディレクトリ数
総論理セクタ数
メディアディスクリプタ
FAT1 面に必要なセクタ数
トラック/セクタ
ヘッド数
不可視セクタ数
32
1
1
1
2
11
0xF8
1
2
1
1
FATファイルシステム
このメディアは、
ディスク容量 = 総容量 − 管理領域容量 = 224バイト
総容量
= 総論理セクタ数 × クラスタサイズ
=
11
×(1 × 32) =352バイト
管理領域容量 = (IPL +FAT +DIR) ×セクタ長
=
4
× 32
=128バイト
空き容量
= 空き(未使用)クラスタ数 × クラスタサイズ
2
× (1 × 32)
= 64バイト
となります。
ここまでで大変大きな疑問が生じます。
クラスタ番号(箱の外の番号)と論理クラスタ番号(箱の中の番号)が一致しません。
容量計算や、ディスクフル計算は箱の外のクラスタの数え方に従っていて、実際これはBPB
の総クラスタ数にも一致します。
ですが、FAT上でチェインされる論理クラスタ番号は何の断りもなく「2」から始まってい
ます。
FATで扱われる論理クラスタ番号は基本的に0オリジンで、論理クラスタ0はデータ部の先
頭を意味します。
このままでは、上の例では論理クラスタ0は論理セクタ2を指していることになりますが、実
際には2ずれています。
(論理セクタ2は論理クラスタ2の位置にあります)
(後述)
これは、論理クラスタ0と1はリザーブされているためです。
注:クラスタサイズは セクタ/クラスタ × セクタ長 となります。
セクタ/クラスタ:クラスタ構成セクター数
物理アクセス単位(セクタ)サイズ
512
1024
2048
4096
ファイル管理単位(セクタ/クラスタ)
1
2
4
8
12
FATファイルシステム
では次にルートディレクトリの内容を示します
① ③
41
00
44
00
00
E5
②
42
00
45
00
E5
E5
43
00
46
00
E5
E5
20
00
20
00
E5
E5
20
00
20
00
E5
E5
20
00
20
00
E5
E5
20
35
20
38
E5
E5
20-20
64-67
20-20
64-67
E5-E5
E5-E5
20
29
20
29
E5
E5
20
02
20
07
E5
E5
20
00
10
00
E5
E5
00
46
00
00
E5
E5
00
00
00
00
E5
E5
④
00
00
00
00
E5
E5
00
00
00
00
E5
E5
ABC
....
......5dg)..F...
DEF
.....
......8dg)......
.eeeeeeeeeeeeeee
eeeeeeeeeeeeeeee
<図7 MS−DOSでのディレクトリ例>
上のディレクトリをDirコマンドで見た状態です
ドライブ x: のディスクのボリュームラベルはありません.
ディレクトリは x:\
ABC
DEF
70 00-11-07 12:33
<DIR>
00-11-07 12:33
2 個のファイルがあります.
64 バイトが使用可能です.
<図8 MS−DOSのDIRコマンド出力例>
<図9 仮想FAT8ディレクトリ>
+00
①属性
Bit7
ファイル名(8Byte)
+07
+08
+09
拡張子
(3Byte)
+0A
+0B
属性 ①
+0C
未使用
+15
+16
+17
+18
+19
+1A
+1B
+1C
+1D
+1E
+1F
更新時刻 ②
更新日付 ②
0
1:読み込み専用
1:隠しファイル属性
1:システム属性
1:ボリュームラベル属性
1:ディレクトリ属性
1:アーカイブ属性
②更新時刻
Bit15
0
HHHHHMMMMMMSSSSS
HHHHH:0-23(時) MMMMMM0-59(分)
SSSSS:0-58(秒 2 秒単位)
FATエントリ番号 ③
ファイルサイズ ④
②更新日時
Bit15
0
YYYYYYYMMMMDDDDD
YYYYYY:0-199(年 0=1980 年)
MMMM:0-12(月) DDDDD:0-32(日)
13
FATファイルシステム
③FATエントリ番号
そのディレクトリに関連したデータがある場合は、その先頭クラスタが入ります。
データが無い場合は0をセットします。
④ファイルサイズ
そのディレクトリに関連したデータがある場合は、その有効データサイズが入ります。
データが無い場合は0をセットします。
APIでファイルを作成
データ無しでCLOSE
APIでファイルを作成
データ有りでCLOSE
既にデータがある状態から
データを全て削除
FATエントリ
ファイルサイズ
0
0
n
n
n/0
0
ファイル名は先頭が「0xE5」である場合、そのディレクトリの有効性は失われます。
すなわちファイルを削除した場合は、関連クラスタが開放され、後に該当ディレクトリ
の先頭バイトに0xE5がセットされます。
これと同一の目的に使われるコードに「0x00」があります。
※ フォーマット時には 0x00 で初期化されており、ファイルを検索する場合のターミネータに
なります。
14
FATファイルシステム
次はIPLの内容です。
+000
+001
+002
+003
+004
+005
+006
+007
+008
+009
+00A
+00B
+00C
+00D
+01C
+01D
+01E
+01F
Jump
'N'
'E'
OEM名等 'C'
''
'2'
'.'
'0'
'0'
(0xEB)
(0x1C)
(0x90)
(0x4E)
(0x45)
(0x43)
(0x20)
(0x32)
(0x2E)
(0x30)
(0x30)
このIPL領域は、FATファイルシステムの中で最も
混沌とした領域です。
左記のIPLはMS−DOS 3.xのFAT12に該
当します。
MS−DOS 2.xのFAT12ではIPLはオール
0です。
MS−DOS 5.x FAT12、FAT16、
FAT32ではみな少しづつ内容が異なります。
BPB (19)バイト
BOOT等
L
セクタ長
(2Byte)
H
<図10 仮想FAT8のIPL>
クラスタ/セクタ
(1Byte)
L
FAT 開始セクタ番号 (2Byte)
H
FAT 面数
(1Byte)
総ルートディレクトリ数
(2Byte)
L
H
L
総論理セクタ数 (2Byte)
H
メディアディスクリプタ
(1Byte)
FAT1 面に必要な
L
セクタ数
(2Byte)
H
L
トラック/セクタ
(2Byte)
H
L
ヘッド数
(2Byte)
H
L
不可視セクタ数 (2Byte)
H
15
FATファイルシステム
次はFATの内容です。
ここでは、仮想のFAT8ですので以下の規則を適用します。
0x00
0x01−0xF6
0xF7
0xFF
空き
使用中(次のクラスタ番号)
欠陥クラスタ
ファイルEND
<図11 仮想FAT8のFAT>
論理クラスタ番号(FAT 番号)
FAT ID(BPB メディアディスクリプタ)
00
0xF8
予約
01
0xFF
File ABC の開始クラスタ
02
0x03
FIle ABC の途中クラスタ
03
0x04
File ABC の最終クラスタ
04
0xFF
File GHI の最終クラスタ
05
0xFF
空き
06
0x00
ディレクトリ DEF の最終クラスタ
07
0xFF
08
空き
0x00
先に説明した通り、論理クラスタ2から実際のデータが格納されます。
上図のように、ファイルはクラスタ単位で管理されていますから、そのファイルの最終クラスタにあ
る有効データ長がわからなければなりません。
そのためにディレクトリのファイルサイズが使われます。
余談として:
BPBの値は静的なものでダイナミックには基本的は変更できません。
唯一のダイナミックな変更が可能なのは、リムーバブルメディアとした時だけです。
但し、これはメディアやデバイスで決まるのではなく、そのドライブ用に登録されたデバイスドライ
バの特質です。
従って、仮にMOメディアであってもそのドライバがそのデバイスに対し、リムーバブルメディアで
はないとOSに通知すればそれは固定メディアになってしまいます。
16
FATファイルシステム
次はディレクトリ DEF 、すなわち論理クラスタ7の内容です
<図12 サブディレクトリ(フォルダ)>
2E
00
2E
00
47
00
00
00
20
00
2E
00
48
00
00
00
20
00
20
00
49
00
00
00
20
00
20
00
20
00
00
00
20
00
20
00
20
00
00
00
20
00
20
00
20
00
00
00
20
38
20
38
20
43
00
00
20-20
64-67
20-20
64-67
20-20
64-67
00-00
00-00
20
29
20
29
20
29
00
00
20
07
20
00
20
05
00
00
10
00
10
00
20
00
00
00
00
00
00
00
00
03
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
①
00
00
00
00
00
00
00
00
②
.
.....
......8dg)......
..
.....
......8dg)......
GHI
....
......Cdg)......
................
................
注目すべき点はフォルダには必ず、
. (自己のフォルダ)
.
. (上位フォルダ )
の2つのディレクトリが作成されます。
(ルートディレクトリを除く)
このフォルダは実際には操作面でのメリットも多少ありますが、このディレクトリ情報に<図12
>の様に①や②の論理クラスタ番号を入れることで、OSの制御面に貢献しています。
ディレクトリ「.
」
(自己)にスタンプされる論理クラスタ番号(①)は自己のサブディレクトリが
格納されている領域の開始論理クラスタ番号が入ります。
ディレクトリ「.
.
」
(上位)にスタンプされる論理クラスタ番号(②)は上位のディレクトリが格
納される領域の開始論理クラスタ番号が入ります。
<図12>では、
「.
.
」の上位ディレクトリ側に論理クラスタ番号は「0」になっています。
これは上位がルートディレクトリであることを意味します。
フォルダデータは最初のクラスタ分を使い果たすと次の空きクラスタが取得され、FAT上でもリ
ンクされます。
ただし、有効データ長はどこにも入りません。
(フォルダには有効データ長なし理由↓参照)
フォルダデータは0クリアされて取得され、先頭データ=0=空きディレクトリの原則で有効
ディレクトリデータ範囲が判定されます。
また、フォルダ用に一度取得されたクラスタは該当フォルダ内の全てのディレクトリが消去された
としても解放されることはありません。
すなわち一旦フォルダ内に多くのファイルを書き込むと、それらを消去してもフォルダ用に取
得されたクラスタのリンクは無駄なデータとして残りつづけます。
この状態は該当フォルダ自身が消去されるまで継続されます。
これで仮想FAT8を使った概要説明は終わりです。
これ以降はFAT12、16、32のそれぞれの詳細について記述しますが、ここまでの概要に重
複する内容は省略します。
17
FATファイルシステム
5.マルチタスク化で追加された内容
MS−DOS 4.0では先読み、ラージバッファ、IFS、ディレクトリキャッシュ等盛りだくさ
んに機能追加したマイクロソフトですが、結局どれも破綻をきたし、
(コンベンショナルが異常に浪
費されたがそれに見合う実行レートの改善はなかった)MS−DOS 5.0では無くなっています。
その代わり、5.0では複数のAPが動作できるようになり、FATファイルシステムとしては、致
命的な問題が浮上しました。
FATファイルシステムでは、そのスループットの向上のため、FATやDIRの一部がOS内部の
メモリに一時的にキャッシングされています。
このキャッシュはリムーバブルメディアの場合、メディアが取り出されることで無効となります。
これを実現するために、リムーバブルデバイスにはメディアが取り出されたことをラッチする機構が
必須になっています。
この機構はメディアが再びセットされても、そのステータス自身を読み出すまでは消えない仕組みに
なっています。
言い方を変えれば、このステータスは一度だけ報告されるステータスです。
この仕組みがマルチタスクユーザーでは問題になります。
例えば、同じ ABC.txt というファイルがルート上にある2つのFDがあるとします。
時間軸
ドライブ
プロセス1
Open "ABC.txt"
FD1
プロセス2
Open "ABC.txt"
Read "ABC.txt"
Close "ABC.txt"
FD2
Write "ABC.txt"
Close "ABC.txt"
<図13 マルチプロセス等での問題>
18
FATファイルシステム
<図13>の様なオペレーションが発生すると、プロセス1が仮にWrite時にメディア交換
の有無をチェックしても、そのステータスはプロセス2に取られてしまっているので気づくこと
ができません。
ABC.txt はFD1、2上にそれぞれあるので、これも警告を発する要因にはなれませ
ん。
そのためプロセス1の利用者は、自分が意図した操作とは違い、FD2の ABC.txt を
更新してしまいます。
この問題を回避する苦肉の策として、リムーバブルメディアではそのフォーマット時に、PCの
時計から生成される乱数をIPLに記録します。
(IPLの何処に?)
そしてオープン中のファイル資源については、資源毎にIPLの乱数も一緒にキャッシングしま
す。
そして、実際にメディアに書き込み動作が発生する場合(実際にはOSは各アクセスの間隔も監
視し、アクセス間隔に一定以上のインターバルがある場合のみ)
、メディア上のIPLの乱数と資
源毎にキャッシングした乱数と比較します。
これにより、できる限り先の様な不測の事態が起こるのを防いでいます。
Win98等でこれを実現すると、ブルー画面になり、
ドライブ x:のディスク読み取りエラー
シリアル番号 XXXX-XXXX のディスク
ドライブ x: に入れてください。
を
OK は Enter,キャンセルは Esc を押してください: OK
<図14 Win98ブルーパニック>
となります。
もしこれで該当ディスクをユーザーが見つけることができなければ、PCを再起動する以外復
帰することはできません。
現実には、最近はフォーマット済みのFD等も多く、これらはシリアル番号は0に固定されて
いるので、OS自身はシリアル番号(乱数)以外のDIR情報も検査の対象にしているようで
す。
19
FATファイルシステム
6.FAT12の詳細
FAT12にはパーティションの概念はありません。
従って、ディスク構造は3.の2)のシングルパーティションと一致します。
FAT12は現在ではFDと一部のスマートメディア等に使われています。
1)IPL領域
FAT12のIPL領域は、幾つかのバリエーションがあります。
これは、初代がMS−DOS 2.x、次がMS−DOS 3/4.x世代、次がMS−D
OS 5.x以降と大きく分けて3種類があります。
MS−DOS 2.xはシステムを登録することをフォーマット時に指定しない場合は「0」
です。
システムを登録することを指定した場合はIPLコードが入ります。
IPLにBPBが入るようになったのはMS−DOS 3.xの途中からだと記憶していま
す。
IPL部の先頭3バイトはx86 CPUのショートジャンプとNOP命令が格納されます。
EB XX 90
このXXがジャンプの相対値ですが、その値が
EB 1C 90
EB 3C 90
の2つが代表的(マナーの良い部類の)な値になります。
次ページにこの2種類の形式を記載します。
MS−DOS 5.x以降ではBPB最後の「不可視セクタ数」が2バイトから4バイトに拡張
されていることに注意してください。
IPL中のボリューム名は実際の表示当には使用されていません。
あくまでもディレクトリの属性0x28または0x08のボリュームラベルが有効になります。
20
FATファイルシステム
+000
+001
+002
+003
+004
+005
+006
+007
+008
+009
+00A
+00B
+00C
+00D
Jump
'N'
'E'
OEM名等 'C'
''
'2'
'.'
'0'
'0'
(0xEB)
(0x1C)
(0x90)
(0x4E)
(0x45)
(0x43)
(0x20)
(0x32)
(0x2E)
(0x30)
(0x30)
BPB (19)バイト
+01C
+01D
+01E
+01F
BOOT等
(EB,1C は+002 からの相対
で+1C ジャンプ=+01E)
+000
+001
+002
+003
+004
+005
+006
+007
+008
+009
+00A
+00B
+00C
+00D
+01C
+01D
+01E
+01F
+020
+021
+022
+023
+024
+025
+026
+027
+028
+029
+02A
+02B
+035
+036
+037
+038
+039
+03A
+03B
+03C
+03D
+03E
+1FF
Jump
'M'
'S'
OEM名等 'D'
'O'
'S'
'5'
'.'
'0'
BPB (19)バイト
不可視セクタ数(0)
(High Word)
全論理セクタ数
(0)
L
H
L
H
L
H
ドライブID
(0)
ダーティフラグ (0)
拡張ブートサイン(0x29)
シリアル番号
L
H
L
H
ボリューム名
(11Byte)
FATタイプ 'F' (0x46)
'A' (0x41)
'T' (0x54)
'1' (0x31)
'2' (0x32)
' ' (0x20)
' ' (0x20)
' ' (0x20)
BOOT等
+1FF
<図15 FAT12 IPL>
21
(0xEB)
(0x3C)
(0x90)
(0x4D)
(0x53)
(0x44)
(0x4F)
(0x53)
(0x35)
(0x2E)
(0x30)
FATファイルシステム
2)FAT領域
FAT領域はFAT12だけはちょっと面倒です。
まず、FAT領域に書き込めるデータ一覧を示します。
0x000
0x001
0x002−0xFF6
0xFF7
0xFF8−0xFFE
0xFFF
空きを示す
予約
次論理クラスタ番号
欠陥クラスタ
メディアディスクリプタ
ファイルEND
例としてメディアID=0xF8で
002−>123.
.
.
.
.
003−>456.
.
.
.
.
の関係があった場合、FAT領域には
FAT
FAT
FAT
FAT
0
1
2
3
0xFF8 メディアディスクリプタ
0xFFF 予約
0x123
0x456
となる訳ですが、これが実際のFATでは
+0 +1 +2 +3 +4 +5
F8 FF FF 23 61 45
となります。
これを分解すると
+0 +1 +2 +3 +4 +5
F8 FF FF 23 61 45
となります。
従って、n番目の偶数番FATデータ(EvF)を配列FAT[ ]から読み込むには
EvF = ( FAT[(n×12)÷8] ¦ ( FAT[(
(n×12)÷8)+1] << 8 )
& 0xFFF)
n番目の奇数番FATデータ(OdF)を配列FAT[ ]から読み込むには m=n−1として
OdF = ( (FAT[((m×12)÷8)+1] << 4) ¦ ( FAT[ (m×12)÷8] >> 4 ) ) & 0xFFF)
22
FATファイルシステム
となります。
書き込みはその逆です。
メディアディスクリプタはユニークなメディアの場合は0xF8、すなわち0xFF8を割り当て
ます。
3)ディレクトリ領域
ディレクトリ領域は、基本的に先の仮想FAT8と同じでも動作しますが、OSによってはそれ以
上の内容を更新してくる場合がありますので、最近の形式を示します。
また、VFATのために、属性が0x0Fのものは処理してはいけません。
<図16 FAT12ディレクトリ>
+00
+00
ファイル名(8Byte)
+07
+08
+09
+0A
+0B
+0C
+0D
+0E
+0F
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+1A
+1B
+1C
+1D
+1E
+1F
拡張子
(3Byte)
属性
未使用
アクセス日付
未使用
更新時刻
更新日付
FATエントリ番号
ファイルサイズ
ファイル名(8Byte)
+07
+08
+09
+0A
+0B
+0C
+0D
+0E
+0F
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+1A
+1B
+1C
+1D
+1E
+1F
MS−DOS 7.1
拡張子
(3Byte)
属性
未使用(NT では小文字フラグ)
作成時刻(10ms の単位)
作成時刻
作成日付
アクセス日付
未使用
更新時刻
更新日付
FATエントリ番号
ファイルサイズ
GUI、DOS窓
小文字フラグ(NTのみ有効)
:Bit3=1 ファイル名は全て小文字扱い
Bit0=1 拡張子は全て小文字扱い
属性や時刻、日付等は仮想FAT8と同一形式です。
作成時刻(10ms)は無視しても問題は特にありません。
23
FATファイルシステム
7.FAT16の詳細
FAT16はWindows95 OSR2でのFAT32の登場までの間の大容量ディスクを
支えて来たFATです。
マイクロソフトのFormatコマンドを使う場合は、実質2Gバイトまでの領域をカバーでき
ます。
(MSのFormatはクラスタサイズが32Kまでなのでこの数値になる)
しかし、ハードディスクの進歩は目覚しく、あっという間に2Gを超えてしまいました。
このためFAT16=マルチパーティションと言っても過言ではないほど、マルチパーティショ
ンが多用されたため、FDISKを超えるツールが多く出回りました。
FAT16はシングルパーティションも可能です。
シングルパーティションではFAT12とあまり大差はありません。
1)IPL領域
★IPL領域ではBPBの不可視セクタ数と総論理セクタ数が完全に4バイト対応になり、
2バイトの総論理セクタ数は使用されなくなり、0が格納されるようになりました。
BPBの範囲は原則、
「FATタイプ」までですが、フォーマット済みのMO等ではその後
ろも数バイト、パラメータが格納されているものもありますが、内容は不明です。
当然、これらは無くても動作しなければなりません。
FAT16ではIPL部は1または2セクタです。
24
FATファイルシステム
+000
+001
+002
+003
+004
+005
+006
+007
+008
+009
+00A
+00B
+00C
+00D
+01C
+01D
+01E
+01F
+020
+021
+022
+023
+024
+025
+026
+027
+028
+029
+02A
+02B
+035
+036
+037
+038
+039
+03A
+03B
+03C
+03D
+03E
Jump
''
''
OEM名等 ''
''
''
''
''
''
(0xEB)
(0x3C)
(0x90) 代表的なフォーマッタによるデータが手元に無いため
(0xXX) XXとしました。
(0xXX)
(0xXX)
(0xXX)
(0xXX)
(0xXX)
(0xXX)
(0xXX)
BPB (19)バイト
前パーティションの合計
不可視セクタ数
(High Word)
全論理セクタ数
L
H FAT16中期(32M 以上)
必須領域になりました。
L
H
L
H
ドライブID
(0)
ダーティフラグ (0)
拡張ブートサイン(0x29)
シリアル番号
L
H
L
H
ボリューム名
(11Byte)
<BPB詳細>
L
セクタ長
(2Byte)
H
クラスタ/セクタ
(1Byte)
L
FAT 開始セクタ番号 (2Byte)
H
FAT 面数
(1Byte)
総ルートディレクトリ数
(2Byte)
L
H
L
総論理セクタ数 (2Byte)
H
メディアディスクリプタ
(1Byte)
FAT1 面に必要な
L
セクタ数
(2Byte)
H
L
トラック/セクタ
(2Byte)
H
L
ヘッド数
(2Byte)
H
L
不可視セクタ数 (2Byte)
H
FATタイプ 'F' (0x46)
'A' (0x41)
'T' (0x54)
'1' (0x31)
'6' (0x36)
' ' (0x20)
' ' (0x20)
' ' (0x20)
BOOT等
+1FF
<図17 FAT16 IPL>
25
FATファイルシステム
2)FAT領域
FAT領域は、16Bitなため操作はシンプルです。(リトルエンディアン)
FAT領域に書き込めるデータ一覧を示します。
0x0000
0x0001
0x0002−0xFFF6
0xFFF7
0xFFF8
0xFFFF
空きを示す
予約
次論理クラスタ番号
欠陥クラスタ
メディアディスクリプタ
ファイルEND
3)ディレクトリ領域
ディレクトリ領域は、基本的にFAT12と同じです。
また、VFATのために、属性が0x0Fのものは処理してはいけません。
4)容量計算
データ部セクタ数 = 全セクタ数 − (FAT面数 × FAT1面に必要なセクタ数)
− ディレクトリに必要なセクタ数 − FAT開始セクタ番号
容量 = ( データ部セクタ数 ÷1クラスタのセクタ数 の商) × クラスタサイズ
5)MBR
MBR(Multi Boot Recode)は、FATファイルシステムとは別物ですが、
概要だけここで説明します。
MBRは512バイトで、全部で4つのパーティションを設定できます。
MBR
Boot 他
シリンダ0 ヘッド0
IPL
FAT
DIR
データ
<図18 MBRの位置>
MBRはMS−DOSやWINDOWS上では隠蔽された領域で、通常のAPIやDebug
コマンド等では見ることはできません。
MS−DOSやWINDOWS上でMBRを見るにはINT 13HのDisk Bios等
を使うことになります。
26
FATファイルシステム
+000
ブート ID
パーティションの開始位置
(CHS)
Bootの一部
+1BE
パーティション1
+1CE
パーティション2
+1DE
パーティション3
+1EE
パーティション4
パーティション ID
パーティションの終了位置
(CHS)
先頭からの相対開始位置
システム領域
+1FF
パーティションサイズ
<図19 MBRの構成>
CHSはシリンダー、ヘッド、セクタのことでINT 13HのDisk Bios形式
(+00はDHレジスタ、+01はCLレジスタ、+02はCHレジスタ)です。
+000
+001
+002
HHHHHHHH
CSSSSSSS
CCCCCCCC
<図20 CHS>
位置 =
+
+
ヘッドNo
= HHHHHHHH
セクタNo
= SSSSSSS
シリンダNo = C(+001) CCCCCCCC(+002)
シリンダNo × ヘッド数
× セクタ数
( ヘッドNo−1)× セクタ数
セクタNo
で計算されますが、ヘッド数やセクタ数はBIOSのパラメータです。
ブートIDは
0x80
0x00
起動可能
起動不可
パーティションIDは
FAT16
E5(06)
F5(05)
FAT32
0B
0C
27
基本パーティション(起動可能)
拡張パーティション(起動不可)
L
H
L
H
L
H
L
H
FATファイルシステム
8.FAT32の詳細
FAT32は、このドキュメントが作成された2000年の主流のFATです。
(NTベースはNTFSが主流ですが.
.
.
)
マイクロソフトのFormatコマンドを使う場合は、実質2Tバイトまでの領域をカバーでき
ます。
(クラスタサイズ=32Kで)
FAT16以前との大きな差は、ルートディレクトリの扱いです。
FAT32ではルートディレクトリの位置が固定領域ではなくなりました。
また、FAT領域も大容量化と32ビット化に伴い、MByte級になります。
このことは、キャッシュ構造の見直しが必要な重大なファクタです。
(Gバイトを超えないメディアにFAT32を適用する場合は注意が必要です。
)
1)IPL領域
FAT16の条件は含まれます。
(7.の1)
)
IPL領域自体もミラーが置かれる様になりました。
大抵の場合IPLミラーは論理セクタ6に置かれ、FAT開始論理セクタは32になります。
EB
02
AC
01
80
20
7B
CD
58
00
2D
00
00
20
8E
13
90
00
25
06
29
46
C1
73
4D
00
01
00
DB
41
8E
05
53
00
A2
00
15
54
D9
B9
57
F8
24
00
56
33
BD
FF
49
00
00
00
3A
32
00
FF
4E-34
00-3F
00-00
00-00
4E-4F
20-20
7C-88
8A-F1
2E
00
00
00
20
20
4E
66
31
FF
00
00
4E
33
02
0F
00
00
00
00
41
C9
8A
B6
02
9A
02
00
4D
8E
56
C6
10
5F
00
00
45
D1
40
40
20
06
00
00
20
BC
B4
66
00
00
00
00
20
F4
08
0F
.X.MSWIN4.1... .
........?...._..
.-%..$..........
................
..)..V:NO NAME
FAT32 3.....
{......¦.N..V@..
..s......f...@f.
IPLのグループ内にFSINFOが追加され、未アロケーションユニット数と、最終変更
アロケーションユニット番号がスタンプされる様になりました。
これは、巨大化したFAT領域から空き容量の計算を高速化したり、書き込みの高速化に貢献
します。
28
FATファイルシステム
+000
+001
+002
+003
+004
+005
+006
+007
+008
+009
+00A
+00B
+00C
+00D
+01C
+01D
+01E
+01F
+020
+021
+022
+023
+024
+025
+026
+027
+028
+029
+02A
+02B
+02C
+02D
+02E
+02F
+030
+031
+032
+033
+034
(0xEB)
(0x58)
(0x90)
(0x4D)
(0x53)
(0x57)
(0x49)
(0x4E)
(0x34)
(0x2E)
(0x31)
+040
+041
+042
+043
BPB (19)バイト
+059
+05A
Jump
'M'
'S'
OEM名等 'W'
'I'
'N'
'4'
'.'
'1'
+051
+052
ドライブID
予約
(0)
拡張ブートサイン(0x29)
ボリューム名
(11Byte)
x80:起動可 x00:不可
FATタイプ 'F' (0x46)
'A' (0x41)
'T' (0x54)
'3' (0x33)
'2' (0x32)
' ' (0x20)
' ' (0x20)
' ' (0x20)
BOOT等
+1FF
不可視セクタ数
(High Word)
全論理セクタ数
FAT当たりのセクタ
数
アクティブ
ミラーリングフラグ
ファイルシステム
バージョン(予約)
ルートディレクトリ
開始論理セクタ
FSINFO
開始論理セクタ
予備IPL
開始論理セクタ
L
H
L
H
L
H
L
H
L
H
L
H
L
H
L
H
L
H
L
H
L
H
Bit3-0 Active な FAT 番号 Bit7 ミラーリングされていない
Bit6-4 未使用
Bit15-8 未使用 通常:0x0000
予約
+03F
<図21 FAT32 IPL>
29
FATファイルシステム
2)FAT領域
FAT領域は、32Bitなため操作はシンプルです。(リトルエンディアン)
FAT領域に書き込めるデータ一覧を示します。
0x00000000
0x00000001
0x00000002−0x0FFFFFF6
0x0FFFFFF7
0x0FFFFFF8
0x0FFFFFFF
0xF7FFFFFF
空きを示す
予約
次論理クラスタ番号
欠陥クラスタ
メディアディスクリプタ
ファイルEND
予約
FAT32は32Bitをフルに利用していないことに注意してください。
論理クラスタ1には0xF7FFFFFFが格納されます。
3)ディレクトリ領域
VFATのために、属性が0x0Fのものは処理してはいけません。
+00
(3Byte)
FAT32ではルートディレクトリが固定エリアではなく、
任意の場所に展開できます。
これはサブディレクトリと同じ条件(数の制限をなくす)に
するためです。
属性
未使用
作成時刻(10ms の単位)
作成時刻
但し、一般的にはルートディレクトリはフォーマット後には
FAT領域の直後に1クラスタ分確保され開始位置が変わる
事も無く、Chkdsk等ではその領域が換算されることは
ありません。
作成日付
これは上位互換を維持するためです。
アクセス日付
ですが、一部の再配置ツールにより任意の場所に移動される
可能性があります。
このためIPLにはルートディレクトリの開始位置を記録す
る場所が用意されました。
ファイル名(8Byte)
+07
+08
+09
+0A
+0B
+0C
+0D
+0E
+0F
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+1A
+1B
+1C
+1D
+1E
+1F
拡張子
上位FATエントリ番号
更新時刻
デフラグは移動したルートディレクトリをFATの直後に再
配置することを優先します。
更新日付
下位FATエントリ番号
ファイルサイズ
<図22 FAT32 ディレクトリ>
30
FATファイルシステム
4)容量計算
データ部セクタ数 = 全セクタ数 − (FAT面数 × FAT1面に必要なセクタ数)
− 1クラスタに必要なセクタ数 − FAT開始セクタ番号
容量 = ( データ部セクタ数 ÷1クラスタのセクタ数 の商) × クラスタサイズ
ルートディレクトリの容量は「1クラスタに必要なセクタ数」に置き換わっています。
5)FSINFO
FSINFOは通常IPLの直後に配置され、長さは512バイトです。
+000
+001
+002
+003
+004
FSIサイン#1
'R' (0x52)
'R' (0x52)
'a' (0x61)
'A' (0x41)
予約
+1E4
+1E5
+1E6
+1E7
+1E8
+1E9
+1EA
+1EB
+1EC
+1ED
+1EE
+1EF
+1F0
FSIサイン#2
'r' (0x72)
'r' (0x72)
'A' (0x41)
'a' (0x61)
未使用アロケーション
L
ユニット番号
H
L
H
最終変更アロケーション
L
ユニット番号
H
L
H
52 52 61 41 00 00 00 00-00 00 00 00 00 00 00 00
RRaA............
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................
00 00 00 00 72 72 41 61-87 F8 0A 00 02 00 00 00 ....rrAa........
00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.
予約他
+1FF
0x55
0xAA
<図22 FAT32 FSINFO>
31
FATファイルシステム
9.VFAT
この書ではFATファイルシステムとVFATを明確に区別しています。
その理由は、VFATは実際にはFATファイルシステムのFAT構造には影響しないようになって
いるからです。
VFATは過去のFATファイルシステム上でも存在できるように巧みな方法を使っていますが、完全
ではありません。
従ってVFATを利用する場合はかなり注意が必要です。
「VFAT対応」とするとマイクロソフトが考案したバグ(?)まで対応してしまうからです。
1)概要
VFAT(VirtuarFAT)は、8+3文字形式のFATファイルシステムのファイル名を
255文字まで拡張するための仕組みです。
VFATは8+3文字しか扱えない過去のOS下でもファイルとして認識できるようにトリックを
使います。
VFATはロングファイル名をショートファイル名のディレクトリに複数リンクさせることで目的
を達成します。
ロングファイル名ディレクトリ #n
ロングファイル名ディレクトリ #1
ショートファイル名ディレクトリ
<図23 VFAT基本形>
このリンクはFATのようなリンクではなく、もっと原始的なリンクです。
ショートファイル名にリンクされる一連のロングファイル名は、ショートファイル名ディレクトリ
の直前に順序だてて配置されなければなりません。
ロングファイル名の1つのディレクトリに格納される文字数はUNICODEで13文字です。
そのため255文字の最大ファイル名で、20個の連続したディレクトリと1つのショートファイ
ル名のディレクトリを必要とします。
(ショートファイル名ディレクトリのファイル名は従来通りASCII文字です)
連続性は途切れてはいけません。
途中に別なディレクトリを挟むことや、順序が入れ替わることはできません。
仮に一連のロングファイル名ディレクトリに1つでもVFATの条件を満たさないものがあれば、
そのファイルのロングファイル名は無効なものとして、ショートファイル名のみが扱われます。
ボリューム名は8+3形式以外を取ることはできません。
32
FATファイルシステム
2)VFATの例
以下に
ABCDEFGHIJK.LMN というファイルを作成した場合のディレクトリ
状態を示します。
②
①
42
FF
01
47
41
73
4D
FF
41
00
42
29
00
FF
00
48
43
73
4E
FF
42
00
44
29
00
FF
00
49
45
00
00
FF
43
00
46
00
00
FF
00
4A
7E
DB
FF-FF
FF-FF
44-00
00-4B
31-4C
75-73
FF
FF
45
00
4D
29
FF
00
00
00
4E
05
0F
00
0F
00
20
00
00
FF
00
2E
00
06
9A
FF
9A
00
3F
00
FF
FF
46
4C
DA
00
FF
FF
00
00
75
00
BM.N............
................
.A.B.C.D.E....F.
G.H.I.J.K.....L.
ABCDEF 1LMN .?.u
s)s)...us)......
15文字のファイル名ですから、13文字のロングファイル名ディレクトリ(①)と2文字の
ロングファイル名ディレクトリ(②)の2つと1つのショートファイル名ディレクトリの計3
のディレクトリが生成されます。
ロングファイル名では . も文字の内であることに注意してください。
ショートファイル名ディレクトリの名前は
・ファイル名の先頭6文字 + " 1" と拡張子が格納されます。
・その結果、ショートファイル名が重複してしまう場合は
ファイル名の先頭6文字 + " 2" と拡張子が格納されます
・拡張子はファイル名の最後の . 以降の先頭3文字が入ります。
・ . が無い場合は拡張子は入りません。
・" 9"まで使い果たすと
ファイル名の先頭5文字 + " 10" と拡張子が格納されます
3)ロングファイル名ディレクトリ
<図24 ロングファイル名ディレクトリ>
0x01 - 0x14 最終ディレクトリには 0x40 をORする。
+000
エントリ番号
注) ②は 0x02 | 0x40 → 0x42
+001
5文字分
+00B
+00C
+00D
+00E
属性(通常ディレクトリと同じ)
未使用
ショートファイル名ディレクトリチェック値
0x0F
先頭バイトは0x00、0xE5で
消去状態なのは通常ディレクトリと
同じです。
6文字分
+01A
+01B
+01C
予約(0)
また、文字部は全てUNICODE
です。
2文字分
+01F
33
FATファイルシステム
4)ショートファイル名ディレクトリのチェック値
これは一連のロングファイル名の元になっているショートファイル名ディレクトリの正当性
をチェックするためのものです。
ファイルシステムはこのチェック値をチェックし、一致しない場合はロングファイル名のディ
レクトリ側を放棄します。
チェック値の計算方法は
・計算対象はショートファイル名11文字分です
・ショートファイル名が11文字に満たない場合は不足分をスペース文字として
計算対象にします。
Check = 0;
for(i=0;i<10;i++)
{
Check += SDir−>Name[i];
Rol
= Check << 7;
Check
= (Check >> 1) | Rol;
}
Check = SDir−>Name[11];
言葉で説明すると、10文字分まで加算しては右1ビットローテイトシフトし、最後に
11文字目を加算します。
5)VFATの問題点
VFATはさまざまな問題を抱えています。
・ロングファイル名を扱えないAPと扱えるAPが混在すると破壊の危険があります。
ロングファイル名を扱えないAPとは16BitApや元々ファイル名バッファに
11文字分しか用意していないAPです。
VFATは全てのモジュールがロングファイル名を扱えて初めて安全に機能します。
一部のモジュールがショートファイル名のみサポートした場合
ロング名
"ABCDEFGH.TXT"
ショート名
"ABCDEF 1.TXT"
ディスク#1
ロング名
"ABCDEFGX.TXT"
ショート名
"ABCDEF 1.TXT"
ディスク#2
上記の様に明らかに違う2つのファイルを識別することができません。
またショートファイル名のみサポートしたAPでコピーやリネームをしたとたん、
関連していたロングファイル名を失います。
34
FATファイルシステム
・FAT12、16上では深刻な問題を引き起こします。
ロングファイル名を扱うにはディレクトリ上に必要量の連続した空きが必要です。
これはルートディレクトリ数が有限個のFAT12やFAT16では深刻な事態を引き起こし
ます。
すなわち、対象がルートディレクトリである場合、どんなにメディアに空き容量があっても、
ディレクトリを格納するエリアに連続した空きが無い限り、その試みは失敗に終わらせなけれ
ばならないからです。
この場合は「ディスクフル」となります。
・必要以上にディスク容量を圧迫します。
先の4.の4)の最後で、サブディレクトリのために確保されたクラスタは仮にサブディレク
トリ内の全てのファイルを削除しても解放されないことを説明しました。
このためロングファイル名を多用して行くと、気が付かない内に、見た目には見えないデータ
で空き容量を失って行きます。
これをエンドユーザーに説明すのは大変困難なことです。
・必ず255文字が使える訳ではありません
255文字使えるからと、その全てを使うのは危険です。
エクスプローラはなぜか250文字までしか扱えません。
旧WINDOWSでも問題なく運用するには、最大文字数を250文字未満に設定する必要が
あります。
・放棄されたロングファイル名ディレクトリ
ショートファイル名しか扱えない環境でのコピーやリネーム、上記理由によるロングファイル
名の放棄が起きた場合、そのロングファイル名ディレクトリは全て、手付かずのまま残留しま
す。
35
FATファイルシステム
10.ソフトキャッシュについて
最初にFATファイルシステムにおいてはソフトキャッシュが不可欠であることを説明しました。
このキャッシュはOSがMS−DOSやWINDOWSで、かつ扱うメディアがFATコンパチで
ある場合、特には必要ありません。
が、OSが組み込みOS(iTron等)や、FATコンパチではないメディアを扱う場合は必須
です。
1)キャッシュが必要な領域
AP
キャッシュ
FATキャッシュ
メディア
IPL
FAT
ディレクトリキャッシュ
ディレクトリ
データ部
<図25 キャッシュ構成>
データ部にはメディアが回転体で無い限りはキャッシュは必要ありません。
また、ランダムアクセスを行う場合以外は効果はあまりありません。
先読みはMS−DOS 4.xで失敗したことを思い出してください。
FATとディレクトリ領域はキャッシュ効果が最も顕著に現れます。
特にFAT32のFAT領域はMバイト級になりますので、組み込み系でFAT全部をバッ
ファリングできる様な恵まれた環境は少ないと思います。
IPLは5.で説明したIPLの役割を思い出してください。
36
FATファイルシステム
2)MS−DOSやWINDOWSが努力していること
FAT32では最終アロケートクラスタをメディアにスタンプできるようになりましたが、そ
れ以前のFATではできません。
これはアロケーションが歯抜けになって行くFATファイルシステムでは、FAT領域のキャ
ッシュがヒットする確率を落とします。
そのため、FAT32以前のFATではメディアを最初にアクセスした場合、最初の空きアロ
ケーションを探します。
以後、メディアが取り出されるまでアロケーションは検出した空きアロケーションから+方向
にのみ検索されます。
途中でファイルが削除されてもこの原則を維持します。
これによりできる限りFAT領域でのキャッシュヒット率を高めようとしています。
それでもアロケーション検索が一周してしまえば、結果として前方参照が起きます。
結果として、FAT領域のキャッシュは後方参照側にウエイトを置いた方が良いことになりま
す。
3)ディレクトリ領域のキャッシュ
VFATがない場合はディレクトリキャッシュは効果ありません。
なぜなら32バイトぐらいは覚えておけるかです。
VFATでは1つのファイルに最大672バイトのディレクトリ領域が必要です。
これはワーストで512バイトのバッファ3つにディレクトリがまたがることを示します。
そしてVFATは必ず前方参照になります。
従ってディレクトリ領域では後方参照にキャッシュを持っても意味はありません。
37
FATファイルシステム
4)FATキャッシュ概要
FAT制御部は通常キャッシュ状況を考えずに1つ1つのFATを処理することに専念します。
結果、キャッシュ制御部には1FAT単位で読み込み、あるいは書き込みの要求が発生します。
キャッシュ制御部は該当FATがキャッシュバッファ内に無い場合は一定の大きさでメディア
からFAT領域を読み込みキャッシングします。
1FAT アクセス要求
FAT制御部
キャッシュ制御部
nByte 要求
キャッシュバッファ
キャッシュ制御部はクラスタ番号からメディアの該当FAT位置を特定できるような、洗練
されたコードが必要です。
5)ディレクトリキャッシュ概要
ディレクトリキャッシュは一見簡単そうで、実は結構大変です。
FAT12やFAT16ではルートディレクトリ数に制限がありましたから、組み込み系で
はこれを逆手に取って、
「ルートのみ」としてしまえばそれほど複雑さはありません。
FAT32ではルート自身が無制限になりましたからこれが通用しません。
一つの方法として、ディレクトリ(32バイト)単位に、そのディレクトリの先頭からの相対
番号で管理することです。
ディレクトリアクセス要求
(相対番号)
キャッシュ制御部
ディレクトリ制御部
キャッシュバッファ
これでもディレクトリ制御部には
・新規作成(ディレクトリ/ファイル)
・オープン
・消去
(ディレクトリ/ファイル)
・リネーム(ディレクトリ/ファイル)
・チェンジディレクトリ
の要求処理が発生する仕様では難解です。
38
nByte 要求
FATファイルシステム
相川 智弘 様対応
□ 使用できるリムーバブルメディア(デバイス)
:コンパクトフラッシュ含む
本ファイルシステムは、Windows又はDOSにて(物理、論理)フォーマットしたものを使用すること
を前提条件としております。
(フォーマット時にFATnnを指定致します)
↓
本ファイルシステムは、FATでフォーマットされたメディアの内部フォーマット情報から自動的にFATn
nの種類を判断し、アクセスを行います。
↓
故に、ユーザプログラムでFATnnを意識する必要はありません。
□ RAMディスクに関して:
RAMディスクは、各ボード固有(非リムーバブル)領域を使うので、基本的には論理フォーマットをファイ
ルシステムで行う必要があります。
↓
RAMディスク関連の構造体にFATnnを指定する必要があります。
(注)RAM DISK作成ツールにて、RAM DISKドライバー内に自動生成いたします。
39