Warum kann FAT16 nicht mehr als 2 GB speichern?

25

Alle Websites, auf denen ich nach Informationen zu FAT16 suche, geben nur deklarativ an, dass nicht mehr als 2 GB zugewiesen werden können. OKAY. Groß. Ich glaube Ihnen. Aber wie kommst du zu diesem Schluss (außer es nur zu testen)?

Gibt es eine Formel, mit der man bestimmen kann, wie viel ein FAT16-System halten kann?

SangoProductions
quelle
21
Es gibt einen Grund, warum FAT16 eine "16" im Namen hat. :-)
Eric Lippert
28
@EricLippert, um fair zu sein, der Zusammenhang zwischen dem 16 und dem 2 GiB ist nicht sofort offensichtlich, ohne zu wissen, wie der FS funktioniert.
Joey
18
Ich bin nicht zu 100% davon überzeugt, dass diese Frage für diese Site tatsächlich aktuell ist. Vielleicht sollte es nach retrocomputing.stackexchange.com verschoben werden?
Jules
3
Es ist erwähnenswert, dass die Beschränkung auf 2 GB eine praktische Einschränkung für den Umgang von MS-DOS und frühen Windows-Versionen mit FAT16 war. Es ist konzeptionell möglich, 2 GB zu überschreiten, jedoch nicht auf Microsoft-kompatible Weise.
Phyrfox
3
@ LưuVĩnhPhúc Der Kommentar ist korrekt. Ich habe "MS-DOS und frühes Windows" gesagt. Moderne Systeme können mehr als 2 GB in FAT16 verwenden. Eine 4 GB FAT16-Partition funktioniert beispielsweise nicht in alten MS-DOS / Win3.1-Systemen. Und viele Quellen gaben an, dass 2 GB das Limit seien, entweder weil sie geschrieben wurden, als dieses Limit Realität wurde, oder in der kurzen Zeit danach, in der Sie davon abgeraten wurden, weil etwas ältere Systeme damit nicht umgehen konnten. Spätere Systeme können problemlos damit umgehen, aber die 2-GB-Grenze war vor etwa 2000 die Faustregel, und in den nächsten Jahren wurden die alten, veralteten Grenzen angegeben.
Phyrfox

Antworten:

66

FAT16 verwendet 16 Bits, um Cluster zu identifizieren. Daher sind maximal 65536 Cluster vorhanden, bevor Ihnen die Bezeichner ausgehen. Einige Bezeichner sind für die Verwendung außerhalb von Dateien reserviert. Jede Datei belegt mindestens einen Cluster. Größere Cluster erhöhen die Mindestzuweisung pro Datei und erhöhen den Overhead kleiner Dateien.

Die Clustergröße gibt dann Auskunft über das maximal identifizierbare Volumen. Bei 32-KB-Clustern sind dies 32 * 1024 * 65536 B = 2 GB.

Sie können die Clustergröße unbegrenzt erhöhen, indem Sie die Größe Ihrer Festplattensektoren erhöhen, bleiben jedoch auf die maximale Anzahl von Dateien beschränkt. Sie würden auch auf Probleme mit Software stoßen, die die Standardsektorgröße (512B) annahm.

Zu dem Zeitpunkt, an dem physische Volumes von ~ 2 GiB verfügbar waren, waren Prozessoren und Betriebssysteme 32-Bit, so dass die Umstellung auf FAT32 eine vernünftige Wahl war, die erheblich mehr Dateien in kleinen Clustern zuließ

Caleth
quelle
4
"aber erhöhen Sie den Overhead für kleine Dateien" Ich bin nicht sicher, ob das für alle klar ist, da ich nicht sicher bin, ob alle verstehen, was in diesem Zusammenhang unter "Overhead" zu verstehen ist. Ich denke, ein Beispiel würde helfen: "Zum Beispiel nimmt eine Datei mit einem Zeichen 1 Cluster auf der Festplatte ein, von denen der größte Teil vollständig verschwendet wird. Größere Clustergrößen bedeuten mehr Verschwendung."
Reginald Blue
3
Ein paar klarstellende Anmerkungen: 32 KB waren die maximale Clustergröße für verschiedene DOS- und Windows-Versionen. Die Windows NT-Familie unterstützt jedoch größere Clustergrößen seit NT 4.0 (und daher auch Consumer-Versionen von Windows seit XP, da diese auch unterstützt werden). (basiert auf dem NT-Kernel). Dies ermöglicht Größen von bis zu 16 GB, obwohl dies aufgrund der in der Antwort angegebenen Ineffizienz unwahrscheinlich ist. Sie könnten ein solches System plausibel verwenden, wenn Sie vorwiegend große Dateien speichern möchten, insbesondere wenn diese in Vielfachen der 256-KB-Clustergröße vorliegen, die Sie verwenden müssten ...
Jules
5
... aber dann würden Sie wahrscheinlich das nächste Limit erreichen, was sowohl für FAT16 als auch für FAT32 ein Problem darstellt: Die maximale Dateigröße ist auf 1 Byte (4 GB) begrenzt, da nur 4 Byte zum Speichern zugewiesen sind Verzeichniseinträge. OTOH, wenn Sie zufällig eine große Anzahl von Dateien in Größen von etwa 256 KB bis zu 2 GB mit einer Potenz von zwei Größen und einer Gesamtgröße von <16 GB speichern müssen, ist FAT16 möglicherweise das effizienteste Format für diese Dateien.
Jules
@Jules: Nur potentiell. Denken Sie daran, dass es einen Overhead pro Cluster gibt. Dateisysteme, die Speicherläufe ermöglichen, sind effizienter, wenn nur eine geringe Fragmentierung vorliegt.
Deduplizierer
12

Tatsächlich gab es im Laufe der Jahre mehrere Varianten von "FAT16" mit unterschiedlichen Grenzwerten. Betrachten wir jedoch die Version, die von "compaq DOS 3.31" bis zu Windows 95 bestand.

FAT-Volumes sind in Cluster unterteilt. Jeder Cluster besteht aus einer Potenz von zwei Sektoren. Die Anzahl der Sektoren pro Cluster auf FAT16 wird als vorzeichenbehaftete 8-Bit-Zahl gespeichert. Die maximal möglichen Sektoren pro Cluster sind also 64.

Clusternummern wurden als 16-Bit-Wert ohne Vorzeichen gespeichert. Begrenzen der Gesamtzahl der Cluster auf 65536. Multiplizieren Sie diese mit den maximalen Sektoren pro Cluster, und Sie erhalten ein Limit von 4194304 Sektoren.

Die (logische) Sektorgröße von Festplatten beträgt 512 Bytes. Multiplizieren Sie dies mit der oben genannten Anzahl von Sektoren und Sie erhalten Ihr 2GiB-Limit. Grundsätzlich kann ein Medium mit größeren Sektoren ein größeres FAT16-Volume unterstützen, aber ich glaube nicht, dass dies in der Praxis passiert ist.

Windows NT änderte die Interpretation des Felds "Sektoren pro Cluster" zu 8 Bit ohne Vorzeichen. Dies ermöglichte eine 4GiB FAT16-Partition mit 512-Byte-Sektoren (und theoretisch größer auf Laufwerken mit größeren Sektoren). AIUI Windows 98 fügte Unterstützung für das Lesen und Schreiben solcher Partitionen hinzu, aber es konnte sie nicht erstellen und die Festplatten-Dienstprogramme konnten sie nicht reparieren.


Es wäre sicherlich möglich gewesen, kleinere Änderungen am Dateisystemformat vorzunehmen, um größere Cluster und damit größere Volumes zu unterstützen. MS entschied sich jedoch für die radikalere Option, zu einem 32-Bit-Cluster-Index überzugehen, bei dem Windows 95 OSR2 FAT32 produziert.

Ich glaube, der Grund für die radikalere Option war die Raumeffizienz. Bei den damals üblichen Dateigrößen waren 32-kB-Cluster schon ziemlich verschwenderisch und größere wären sogar so verschoben worden.

Peter Green
quelle
4
Ich musste hart überlegen, ob "64 Sektoren pro Cluster maximal möglich sind", bis ich es herausfand: 64 ist in der Tat die größte Potenz von 2, die Sie in einem Byte mit Vorzeichen darstellen können: 128 ist nicht möglich, da das Maximum mit positivem Vorzeichen vorliegt Bytewert ist 127.
Ralf Kleberhoff
3
@RalfKleberhoff Das führt natürlich zu einer weiteren Frage: Wenn Sie eine Zweierpotenz speichern, warum speichern Sie dann die Zahl selbst und nicht den Exponenten auf den beiden?
Daniel Wagner
@ DanielWagner Ich stimme absolut zu. Vor allem als damals FAT16 entwickelt wurde, war das Schalten definitiv billiger als das Multiplizieren. Aber wahrscheinlich haben sie sich nur gefreut, es zum Laufen zu bringen und es Jahrzehnte später nicht mehr mit Software zu entwickeln ...
Ralf Kleberhoff