Dlaczego FAT16 nie może przechowywać więcej niż 2 GB?

25

Wszystkie strony, które odwiedzam, szukam informacji na temat FAT16, po prostu deklaratywnie stwierdzają, że nie można przeznaczyć więcej niż 2 GB. DOBRZE. Świetny. Wierzę ci. Ale jak dojść do tego wniosku (poza testowaniem go)?

Czy istnieje jakiś wzór, który można wykorzystać do ustalenia, ile system FAT16 może pomieścić?

SangoProductions
źródło
21
Istnieje powód, dla którego FAT16 ma w nazwie „16”. :-)
Eric Lippert
28
@EricLippert, szczerze mówiąc, połączenie między 16 a 2 GiB nie jest od razu oczywiste bez wiedzy o działaniu FS.
Joey,
18
Nie jestem w 100% przekonany, że to pytanie dotyczy tej witryny. Może powinien zostać przeniesiony na retrocomputing.stackexchange.com?
Jules
3
Warto zauważyć, że limit 2 GB był praktycznym ograniczeniem sposobu, w jaki MS-DOS i wczesne Windows obsługiwały FAT16. Z koncepcyjnego punktu widzenia możliwe jest przekroczenie 2 GB, ale nie w sposób zgodny z Microsoft.
phyrfox
3
@ LưuVĩnhPhúc Komentarz jest poprawny. Powiedziałem „MS-DOS i wczesny Windows”. Nowoczesne systemy mogą korzystać z więcej niż 2 GB w FAT16. Na przykład partycja 4 GB FAT16 nie będzie działać w starych systemach MS-DOS / Win3.1. I wiele źródeł, w których stwierdzono, że 2 GB jest limitem, było albo dlatego, że zostały napisane, gdy limit ten był rzeczywistością, albo wkrótce potem, gdy odradzano ci to, ponieważ nieco starsze systemy nie mogły tego znieść. Później systemy mogą sobie z tym poradzić, ale limit 2 GB był regułą przed około 2000 r., A kilka lat później cytował stare, nieaktualne limity.
phyrfox

Odpowiedzi:

66

FAT16 używa 16 bitów do identyfikacji klastrów. Dlatego przed wyczerpaniem identyfikatorów istnieje maksymalnie 65536 klastrów, a niektóre identyfikatory są zarezerwowane do zastosowań innych niż pliki. Każdy plik zajmuje co najmniej jeden klaster. Większe klastry zwiększają minimalną alokację na plik, zwiększając obciążenie małych plików.

Rozmiar klastra określa następnie maksymalną możliwą do zidentyfikowania objętość. Dla klastrów 32 kB to 32 * 1024 * 65536 B = 2 GiB.

Państwo mogłoby zwiększyć rozmiar klastra w nieskończoność, zwiększając rozmiar swoich sektorów na dysku, ale pozostają ograniczone do maksymalnej liczby plików. Wystąpiłyby również problemy z oprogramowaniem, które przyjęło domyślny rozmiar sektora (512B)

W momencie, gdy dostępne były fizyczne woluminy ~ 2GiB, procesory i systemy operacyjne były 32-bitowe, więc przejście na FAT32 było rozsądnym wyborem, pozwalając na znacznie więcej plików w małych klastrach

Caleth
źródło
4
„ale zwiększ obciążenie dla małych plików” Nie jestem pewien, czy będzie to jasne dla wszystkich, ponieważ nie jestem pewien, czy wszyscy zrozumieją, co w tym kontekście oznacza „koszty ogólne”. Myślę, że przykład by pomógł: „Na przykład plik z jednym znakiem zajmuje 1 klaster na dysku, z czego większość jest całkowicie zmarnowana. Większe rozmiary klastra oznaczają więcej marnotrawstwa”.
Reginald Blue
3
Kilka uwag wyjaśniających: 32 kB był maksymalnym rozmiarem klastra dla różnych wersji DOS i Windows, ale rodzina Windows NT obsługuje większe rozmiary klastrów od NT 4.0 (a zatem także wersje konsumenckie Windows od XP również to obsługują, ponieważ „ oparty na jądrze NT). Pozwala to na rozmiary do 16 GiB, chociaż ze względu na nieefektywność, jak wskazano w odpowiedzi, jest to mało prawdopodobne. Można wiarygodnie używać takiego systemu, jeśli chcesz przechowywać głównie dużych plików, zwłaszcza jeśli pochodzą one wielokrotność rozmiaru klastra 256KiB trzeba by użyć ...
Jules
5
... ale wtedy prawdopodobnie trafisz na kolejny limit, który jest problemem zarówno dla FAT16, jak i FAT32: maksymalny rozmiar pliku jest ograniczony do 1 bajta krótszego niż 4GiB z uwagi na fakt, że tylko 4 bajty są przeznaczone do przechowywania go w pozycje katalogu. OTOH, jeśli zdarzyło Ci się konieczne przechowywanie dużej liczby plików w rozmiarach od około 256 kB do 2 Gb z potęgą dwóch rozmiarów, a całkowity rozmiar <16 GiB, FAT16 jest potencjalnie najbardziej wydajnym formatem dla nich.
Jules
@Jules: Tylko potencjalnie. Pamiętaj, że istnieje narzut na klaster. Systemy plików umożliwiające przechowywanie uruchomień są bardziej wydajne, jeśli fragmentacja jest niewielka.
Deduplicator
12

Przez lata istniało kilka wariantów „FAT16” z różnymi limitami, ale rozważmy wersję, która przetrwała od „compaq DOS 3.31” do Windows 95.

Woluminy FAT są podzielone na klastry. Każdy klaster składa się z potęgi dwóch liczb sektorów. Liczba sektorów na klaster w systemie FAT16 jest przechowywana jako 8-bitowa liczba ze znakiem. Zatem maksymalna możliwa liczba sektorów na klaster wynosi 64.

Numery klastrów były przechowywane jako 16-bitowa wartość bez znaku. Ograniczając całkowitą liczbę klastrów do 65536. Pomnóż ją przez maksymalną liczbę sektorów przypadającą na klastry, a otrzymasz limit 4194304 sektorów.

Rozmiar (logiczny) sektora dysków twardych wynosi 512 bajtów. Pomnóż to przez limit liczby sektorów wspomniany powyżej, a otrzymasz limit 2GiB. Zakładając, że średnie z większymi sektorami mogą obsługiwać większy wolumen FAT16, ale nie sądzę, aby miało to miejsce w praktyce.

Windows NT zmienił interpretację pola „sektorów na klaster” na 8-bitowy bez znaku. Pozwoliło to na partycję FAT16 4GiB z 512-bajtowymi sektorami (i teoretycznie większą na dyskach z większymi sektorami). AIUI Windows 98 dodał obsługę odczytu i zapisu takich partycji, ale nie mógł ich utworzyć, a narzędzia dyskowe nie mogły ich naprawić.


Z pewnością można by wprowadzić stosunkowo niewielkie poprawki w formacie systemu plików, aby obsługiwały większe klastry, a tym samym większe woluminy. Jednak MS zdecydowało się na bardziej radykalną opcję przejścia do 32-bitowego indeksu klastrów z systemem Windows 95 OSR2 produkującym FAT32.

Wierzę, że powodem wyboru bardziej radykalnej opcji była efektywność przestrzeni. Biorąc pod uwagę typowe rozmiary plików w tym czasie, klastry 32kiB były już dość marnotrawione, a większe byłyby nawet takie ruchy.

Peter Green
źródło
4
Musiałem mocno się zastanowić, czy „maksymalna możliwa liczba sektorów na klaster to 64”, dopóki go nie dostałem: 64 to rzeczywiście największa potęga 2, jaką możesz reprezentować w bajcie ze znakiem: 128 nie jest możliwe, ponieważ maksymalna liczba dodatnia ze znakiem bajt ma wartość 127.
Ralf Kleberhoff
3
@RalfKleberhoff To oczywiście prowadzi do kolejnego pytania: jeśli przechowujesz potęgę dwóch, dlaczego przechowujesz samą liczbę, a nie wykładnik dwóch?
Daniel Wagner
@DanielWagner Absolutnie się zgadzam. Zwłaszcza wtedy, gdy powstawał FAT16, przesunięcie było zdecydowanie tańszą operacją niż mnożenie. Ale prawdopodobnie byli szczęśliwi, że go uruchomili, a nie inżynierii oprogramowania przez dziesięciolecia w przyszłość ...
Ralf Kleberhoff