Perché FAT16 non può contenere più di 2 GB?


25

Tutti i siti che vado a cercare informazioni su FAT16 dichiarano solo che non possono allocare più di 2 GB. OK. Grande. Ti credo. Ma come si arriva a questa conclusione (a parte il solo testarlo)?

Esiste una sorta di formula che è possibile utilizzare per determinare quanto può contenere un sistema FAT16?


21
C'è un motivo per cui FAT16 ha un "16" nel nome. :-)
Eric Lippert

28
@EricLippert, per essere onesti, la connessione tra quel 16 e il 2 GiB non è immediatamente ovvia senza sapere come funziona l'FS.
Joey,

18
Non sono convinto al 100% che questa domanda sia effettivamente in tema per questo sito. Forse dovrebbe essere spostato su retrocomputing.stackexchange.com?
Jules,

3
Vale la pena notare che il limite di 2 GB era una limitazione pratica di come MS-DOS e Windows precedenti gestivano FAT16. Concettualmente è possibile superare i 2 GB, ma non in modo compatibile con Microsoft.
phyrfox,

3
@ LưuVĩnhPhúc Il commento è corretto. Ho detto "MS-DOS e Windows precedenti". I sistemi moderni possono utilizzare più di 2 GB in FAT16. Una partizione FAT16 da 4 GB non funzionerà nei vecchi sistemi MS-DOS / Win3.1, ad esempio. E molte fonti che affermavano che il limite era di 2 GB o perché erano state scritte quando quel limite era una realtà, o poco tempo dopo, dove ti era stato consigliato di non farlo perché i sistemi leggermente più vecchi non potevano gestirlo. I sistemi successivi possono gestirlo bene, ma il limite di 2 GB era la regola empirica prima di circa 2000 o giù di lì, e pochi anni dopo che citava i vecchi limiti obsoleti.
phyrfox,

Risposte:


66

FAT16 utilizza 16 bit per identificare i cluster. Pertanto, ci sono un massimo di 65536 cluster prima di rimanere senza identificatori e alcuni identificatori sono riservati per usi diversi dai file. Ogni file occupa almeno un cluster. I cluster più grandi aumentano l'allocazione minima per file, aumentando il sovraccarico di file di piccole dimensioni.

La dimensione del cluster indica quindi il volume massimo identificabile. Per i cluster da 32 KiB, ovvero 32 * 1024 * 65536 B = 2GiB.

È possibile aumentare le dimensioni del cluster indefinitamente, aumentando le dimensioni dei settori su disco, ma si rimane limitati al numero massimo di file. Potresti anche riscontrare problemi con il software che ha assunto la dimensione del settore predefinita (512 B)

Nel momento in cui c'erano volumi fisici di ~ 2GiB prontamente disponibili, i processori e i sistemi operativi erano a 32 bit, quindi passare a FAT32 era una scelta sensata, consentendo un numero enorme di file in piccoli cluster


4
"ma aumenta l'overhead per file di piccole dimensioni" Non sono sicuro che ciò sia chiaro per tutti, poiché non sono sicuro che tutti capiranno cosa si intende per "overhead" in questo contesto. Penso che un esempio sarebbe di aiuto: "Ad esempio, un file con un solo carattere occupa 1 cluster su disco, la maggior parte dei quali è completamente sprecato. Le dimensioni di cluster più grandi significano più sprechi".
Reginald Blue,

3
Un paio di note chiarenti: 32 KiB era la dimensione massima del cluster per varie versioni di DOS e Windows, ma la famiglia Windows NT ha supportato dimensioni di cluster più grandi da NT 4.0 (e quindi anche versioni consumer di Windows da XP lo hanno supportato, in quanto ' basato sul kernel NT). Ciò consente dimensioni fino a 16GiB, anche se a causa dell'inefficienza, come indicato nella risposta, è improbabile che ciò sia utile. Si potrebbe plausibilmente usare un sistema del genere se si volesse archiviare file prevalentemente di grandi dimensioni, soprattutto se arrivassero in multipli della dimensione del cluster di 256 KiB che si dovrebbe usare ...
Jules

5
... ma allora avresti probabilmente raggiunto il limite successivo, che è un problema sia per FAT16 che per FAT32: la dimensione massima del file è limitata a 1 byte in meno di 4GiB dal fatto che ci sono solo 4 byte allocati per archiviarlo in voci della directory. OTOH, se ti è capitato di dover archiviare un numero elevato di file in dimensioni di circa 256 KiB fino a 2GiB con potenza di due dimensioni e dimensioni totali <16GiB, FAT16 è potenzialmente il formato più efficiente per loro.
Jules,

@Jules: solo potenzialmente. Ricorda che esiste un overhead per cluster. I file system che consentono di archiviare le esecuzioni sono più efficienti se c'è poca frammentazione.
Deduplicatore

12

Nel corso degli anni c'erano diverse varianti di "FAT16" con limiti diversi, ma consideriamo la versione che persisteva da "compaq DOS 3.31" fino a Windows 95.

I volumi FAT sono divisi in cluster. Ogni cluster è costituito da una potenza di due numeri di settori. Il numero di settori per cluster su FAT16 è memorizzato come un numero con segno a 8 bit. Pertanto, il numero massimo di settori possibili per cluster è 64.

I numeri dei cluster sono stati memorizzati come valore senza segno a 16 bit. Limitare i cluster totali a 65536. Moltiplicare per i settori massimi per cluster e si ottiene un limite di 4194304 settori.

La dimensione del settore (logico) dei dischi rigidi è di 512 byte. Moltiplicalo per il limite del numero di settori sopra menzionato e otterrai il tuo limite di 2GiB. In pratica un mezzo con dimensioni settoriali maggiori può supportare un volume FAT16 più grande, ma non credo che ciò sia accaduto in pratica.

Windows NT ha modificato l'interpretazione del campo "settori per cluster" in modo che sia senza segno a 8 bit. Ciò ha consentito una partizione FAT16 da 4GiB con settori a 512 byte (e teoricamente più grande su unità con settori più grandi). Windows 98 AIUI ha aggiunto il supporto per la lettura e la scrittura di tali partizioni, ma non è stato possibile crearle e le utilità del disco non sono state in grado di ripararle.


Sarebbe stato certamente possibile apportare modifiche relativamente minori al formato del filesystem per supportare cluster più grandi e quindi volumi più grandi. Tuttavia, MS ha deciso di optare per l'opzione più radicale di passare a un indice cluster a 32 bit con Windows 95 OSR2 che produce FAT32.

Credo che la ragione per scegliere l'opzione più radicale sia stata l'efficienza dello spazio. Date le dimensioni tipiche dei file all'epoca i cluster da 32 kB erano già piuttosto dispendiosi e quelli più grandi sarebbero stati persino spostati.


4
Ho dovuto pensare intensamente ai "settori massimi possibili per cluster è 64", fino a quando non l'ho capito: 64 è davvero la più grande potenza di 2 che puoi rappresentare in un byte con segno: 128 non è possibile come il massimo segno positivo il valore in byte è 127.
Ralf Kleberhoff,

3
@RalfKleberhoff Ciò porta naturalmente a una domanda di follow-up, tuttavia: se si memorizza una potenza di due, perché memorizzare il numero stesso anziché l'esponente sui due?
Daniel Wagner,

@DanielWagner Sono assolutamente d'accordo. Soprattutto ai tempi della creazione di FAT16, il cambio era sicuramente un'operazione più economica della moltiplicazione. Ma probabilmente erano solo felici di farlo funzionare, e non di software-engineering per decenni nel futuro ...
Ralf Kleberhoff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.