FAT16が2 GBを超えて保存できないのはなぜですか?


25

FAT16の情報を探しに行くすべてのサイトは、2 GBを超える容量を割り当てることができないと宣言的に述べています。OK。すばらしいです。私はあなたを信じています。しかし、どうやってその結論に達しますか(テストするだけではありません)?

FAT16システムがどれだけ保持できるかを判断するために使用できる式はありますか?


21
FAT16の名前に「16」が含まれているのには理由があります。:-)
エリックリッパー

28
@EricLippert、公平に言うと、その16と2 GiBの間の接続は、FSがどのように機能するかを知らなければすぐにはわかりません。
ジョーイ

18
私は、この質問が実際にこのサイトのトピックであると100%確信していません。おそらく、retrocomputing.stackexchange.comに移動する必要がありますか?
ジュール

3
2GBの制限は、MS-DOSと初期のWindowsがFAT16を処理する方法の実際的な制限であったことに注意してください。概念的には2GBを超えることは可能ですが、Microsoft互換の方法ではありません。
phyrfox

3
@LưuVĩnhPhúcコメントは正しいです。「MS-DOSと初期のWindows」と言いました。最新のシステムでは、FAT16で2GB以上を使用できます。たとえば、4GB FAT16パーティションは、古いMS-DOS / Win3.1システムでは機能しません。そして、2GBが制限であると述べた多くの情報源は、その制限が現実のものであったときに書かれたためか、少し後に古いシステムがそれを処理できなかったためにあなたに忠告されたすぐ後の時間でした。後のシステムでは問題なく処理できますが、2GBの制限は約2000年前の経験則であり、その数年後は古い古い制限を引用していました。
phyrfox

回答:


66

FAT16は16ビットを使用してクラスターを識別します。したがって、識別子がなくなる前に最大65536のクラスターがあり、一部の識別子はファイル以外の使用のために予約されています。各ファイルは少なくとも1つのクラスターを占有します。クラスターを大きくすると、ファイルごとの最小割り当てが増加し、小さなファイルのオーバーヘッドが増加します。

クラスターサイズは、識別可能な最大ボリュームを示します。32KiBクラスターの場合、32 * 1024 * 65536 B = 2GiBです。

ディスク上のセクターのサイズを増やすことにより、クラスターサイズを無制限に増やすことができますが、ファイルの最大数に制限されたままになります。また、デフォルトのセクターサイズ(512B)を想定したソフトウェアで問題が発生します。

〜2GiBの物理ボリュームがすぐに利用できる時点では、プロセッサーとOSは32ビットであったため、FAT32への移行は賢明な選択であり、小さなクラスターで非常に多くのファイルを許可しました


4
「しかし、小さなファイルのオーバーヘッドを増やす」この文脈で「オーバーヘッド」が何を意味するのか誰もが理解できるかどうかわからないので、それが誰にとっても明らかかどうかはわかりません。「たとえば、1文字のファイルはディスク上の1クラスターを占有しますが、そのほとんどは完全に無駄になります。クラスターサイズが大きいほど無駄が多くなります。」
レジナルドブルー

3
いくつかの明確な注意事項:32KiBは、さまざまなバージョンのDOSおよびWindowsの最大クラスターサイズでしたが、Windows NTファミリは、NT 4.0以降の大きなクラスターサイズをサポートしています(したがって、XPからコンシューマバージョンのWindowsもサポートしているため、 NTカーネルに基づいて再)。これにより、最大16GiBのサイズが可能になりますが、回答に記載されている非効率性のため、これは有用ではありません。あなたは可能性がもっともらしくあなたは、主に大規模なファイルを保存したい場合は...あなたが使用する必要があります彼らは256KiBのクラスタサイズの倍数になった場合は特に、このようなシステムを使用する
ジュール・

5
...しかし、次の制限に達する可能性があります。これはFAT16とFAT32の両方の問題です:最大ファイルサイズは、4GiBを保存するために4バイトしか割り当てられていないため、4GiBの1バイトに制限されていますディレクトリエントリ。OTOH、2のべき乗のサイズで約256KiBから最大2GiBのサイズで大量のファイルを保存する必要があり、合計サイズが16GiB未満の場合、FAT16は潜在的に最も効率的な形式です。
ジュール

@Jules:潜在的にのみ。クラスターごとのオーバーヘッドがあることに注意してください。断片化がほとんどない場合、実行を保存できるファイルシステムはより効率的です。
デュプリケータ

12

実際、長年、さまざまな制限のある「FAT16」のいくつかのバリアントがありましたが、「compaq DOS 3.31」からWindows 95まで持続したバージョンを考えてみましょう。

FATボリュームはクラスターに分割されます。各クラスターは、2の累乗のセクターで構成されています。FAT16上のクラスターあたりのセクター数は、8ビットの符号付き数値として保存されます。したがって、クラスターあたりの最大可能セクターは64です。

クラスター番号は、16ビットの符号なしの値として保存されました。クラスターの合計を65536に制限します。これにクラスターあたりの最大セクターを掛けると、4194304セクターの制限が得られます。

ハードドライブの(論理)セクタサイズは512バイトです。それに上記のセクター数の制限を掛けると、2GiBの制限が得られます。原則として、より大きなセクターサイズのメディアは、より大きなFAT16ボリュームをサポートできますが、実際にはこれが起こったとは思いません。

Windows NTは、「クラスターあたりのセクター」フィールドの解釈を符号なし8ビットに変更しました。これにより、512バイトのセクターを持つ4GiB FAT16パーティションが可能になりました(より大きなセクターのドライブでは理論的に大きくなります)。AIUI windows 98は、そのようなパーティションの読み取りと書き込みのサポートを追加しましたが、それらを作成できず、ディスクユーティリティが修復できませんでした。


確かに、ファイルシステムのフォーマットに比較的小さな調整を加えて、より大きなクラスター、したがってより大きなボリュームをサポートすることは可能だったでしょう。ただし、MSは、Windows 95 OSR2でFAT32を生成する32ビットクラスターインデックスに移行する、より根本的なオプションを選択することにしました。

もっと過激な選択肢を選んだ理由は、スペースの効率性でした。当時の典型的なファイルサイズを考えると、32kiBクラスターはすでにかなり無駄であり、より大きなクラスターもそうでした。


4
「クラスターあたりの最大可能セクターは64」であると、私はそれを得るまで真剣に考えなければなりませんでした。64は実際に符号付きバイトで表現できる最大の2のべき乗です。バイト値は127です
ラルフKleberhoff

3
@RalfKleberhoffそれは自然にフォローアップの質問につながりますが、2の累乗を保存している場合、2の指数ではなく数値自体を保存するのはなぜですか?
ダニエルワーグナー

@DanielWagner私は絶対に同意します。特にFAT16が作成された当時は、シフトは乗算よりも間違いなく安価な操作でした。しかし、おそらく彼らは...それは実行している、といない未来に数十年のためにそれをソフトウェアエンジニアリング取得するだけで満足していた
ラルフKleberhoff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.