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
© Copyright 2024 Paperzz