¿Por qué FAT16 no puede almacenar más de 2 GB?

25

Todos los sitios a los que voy a buscar información sobre FAT16 solo declaran declarativamente que no puede asignar más de 2 GB. OKAY. Excelente. Te creo. Pero, ¿cómo llegas a esa conclusión (aparte de solo probarla)?

¿Existe algún tipo de fórmula que se pueda usar para determinar cuánto puede contener un sistema FAT16?

SangoProductions
fuente
21
Hay una razón por la cual FAT16 tiene un "16" en el nombre. :-)
Eric Lippert
28
@EricLippert, para ser justos, la conexión entre ese 16 y el 2 GiB no es obvia de inmediato sin saber cómo funciona el FS.
Joey
18
No estoy 100% convencido de que esta pregunta sea realmente sobre el tema de este sitio. ¿Tal vez debería trasladarse a retrocomputing.stackexchange.com?
Jules
3
Vale la pena señalar que el límite de 2 GB era una limitación práctica de cómo MS-DOS y Windows temprano manejaban FAT16. Conceptualmente es posible superar los 2 GB, pero no de una manera compatible con Microsoft.
phyrfox
3
@ LưuVĩnhPhúc El comentario es correcto. Dije "MS-DOS y Windows temprano". Los sistemas modernos pueden usar más de 2 GB en FAT16. Una partición FAT16 de 4GB no funcionará en sistemas MS-DOS / Win3.1 viejos, por ejemplo. Y muchas fuentes que declararon que 2 GB era el límite, ya sea porque se escribieron cuando ese límite era una realidad, o el tiempo poco después, donde se le aconsejó que no lo hiciera porque los sistemas un poco más antiguos no podían manejarlo. Los sistemas posteriores pueden manejarlo bien, pero el límite de 2 GB era la regla general antes de aproximadamente 2000, y los próximos años después de eso, citando los límites antiguos y obsoletos.
phyrfox

Respuestas:

66

FAT16 utiliza 16 bits para identificar grupos. Por lo tanto, hay un máximo de 65536 clústeres antes de que se acaben los identificadores, y algunos identificadores están reservados para usos que no sean archivos. Cada archivo ocupa al menos un clúster. Los clústeres más grandes aumentan la asignación mínima por archivo, lo que aumenta la sobrecarga de archivos pequeños.

El tamaño del clúster le indica el volumen máximo identificable. Para los clústeres de 32 KB, es decir 32 * 1024 * 65536 B = 2GiB.

Usted podría aumentar el tamaño del clúster de forma indefinida, al aumentar el tamaño de sus sectores en el disco, pero que siguen siendo limitados al número máximo de archivos. También tendría problemas con el software que asumía el tamaño de sector predeterminado (512B)

En el punto donde había volúmenes físicos de ~ 2GiB fácilmente disponibles, los procesadores y los sistemas operativos eran de 32 bits, por lo que pasar a FAT32 fue una elección sensata, ya que permitió una gran cantidad de archivos en pequeños grupos

Caleth
fuente
44
"pero aumentar la sobrecarga para archivos pequeños" No estoy seguro si eso será claro para todos, ya que no estoy seguro de que todos entiendan lo que se entiende por "sobrecarga" en este contexto. Creo que un ejemplo ayudaría: "Por ejemplo, un archivo con un carácter ocupa 1 clúster en el disco, la mayoría de los cuales se desperdicia por completo. Los tamaños de clúster más grandes significan más desperdicio".
Reginald Blue
3
Un par de notas aclaratorias: 32 KB fue el tamaño máximo de clúster para varias versiones de DOS y Windows, pero la familia de Windows NT ha admitido tamaños de clúster más grandes desde NT 4.0 (y, por lo tanto, las versiones de consumo de Windows desde XP también lo han admitido, ya que ' re basado en el kernel NT). Esto permite tamaños de hasta 16GiB, aunque debido a la ineficiencia como se señala en la respuesta, es poco probable que esto sea útil. Se podría plausiblemente utilizar un sistema de este tipo si desea almacenar los archivos predominantemente grandes, sobre todo si vienen en múltiplos del tamaño del clúster 256KiB que tendría que utilizar ...
Jules
55
... pero es probable que alcance el próximo límite, lo cual es un problema tanto para FAT16 como para FAT32: el tamaño máximo del archivo está limitado a 1 byte por debajo de 4GiB por el hecho de que solo hay 4 bytes asignados para almacenarlo en entradas de directorio OTOH, si tiene la necesidad de almacenar una gran cantidad de archivos en tamaños de alrededor de 256KiB hasta 2GiB con potencia de dos tamaños, y un tamaño total <16GiB, FAT16 es potencialmente el formato más eficiente para ellos.
Jules
@Jules: solo potencialmente. Recuerde que hay una sobrecarga por clúster. Los sistemas de archivos que permiten almacenar ejecuciones son más eficientes si hay poca fragmentación.
Deduplicador
12

En realidad, a lo largo de los años hubo varias variantes de "FAT16" con límites diferentes, pero consideremos la versión que persistió desde "compaq DOS 3.31" hasta Windows 95.

Los volúmenes FAT se dividen en grupos. Cada grupo está compuesto por una potencia de dos números de sectores. El número de sectores por clúster en FAT16 se almacena como un número con signo de 8 bits. Entonces, el máximo de sectores posibles por clúster es 64.

Los números de clúster se almacenaron como un valor sin signo de 16 bits. Limitar el total de clústeres a 65536. Multiplique eso por los sectores máximos por clústeres y obtendrá un límite de 4194304 sectores.

El tamaño del sector (lógico) de los discos duros es de 512 bytes. Multiplique eso por el límite en el número de sectores mencionados anteriormente y obtendrá su límite de 2GiB. En principio, un medio con tamaños de sector más grandes puede soportar un volumen FAT16 más grande, pero no creo que esto haya sucedido en la práctica.

Windows NT cambió la interpretación del campo "sectores por clúster" a 8 bits sin signo. Esto permitió una partición 4GiB FAT16 con sectores de 512 bytes (y teóricamente más grande en unidades con sectores más grandes). AIUI Windows 98 agregó soporte para leer y escribir tales particiones, pero no pudo crearlas y sus utilidades de disco no pudieron repararlas.


Ciertamente habría sido posible realizar ajustes relativamente menores en el formato del sistema de archivos para admitir clústeres más grandes y, por lo tanto, volúmenes más grandes. Sin embargo, MS decidió optar por la opción más radical de pasar a un índice de clúster de 32 bits con Windows 95 OSR2 que produce FAT32.

Creo que la razón para optar por la opción más radical fue la eficiencia del espacio. Dado los tamaños de archivo típicos en ese momento, los clústeres de 32 kB ya eran un desperdicio y los más grandes incluso se habrían movido.

Peter Green
fuente
44
Tuve que pensar mucho en "el máximo de sectores posibles por cluster es 64", hasta que lo obtuve: 64 es de hecho la mayor potencia de 2 que puede representar en un byte firmado: 128 no es posible ya que el máximo positivo firmado el valor del byte es 127.
Ralf Kleberhoff
3
@RalfKleberhoff Eso naturalmente lleva a una pregunta de seguimiento, sin embargo: si está almacenando una potencia de dos, ¿por qué almacenar el número en sí en lugar del exponente en los dos?
Daniel Wagner
@DanielWagner Estoy totalmente de acuerdo. Especialmente en aquel entonces cuando se creó FAT16, el cambio era definitivamente una operación más barata que la multiplicación. Pero probablemente estaban contentos de ponerlo en funcionamiento, y no de ingeniería de software durante décadas en el futuro ...
Ralf Kleberhoff