Por que o FAT16 não pode armazenar mais de 2 GB?

25

Todos os sites em que vou procurar informações no FAT16 afirmam declarativamente que ele não pode alocar mais de 2 GB. ESTÁ BEM. Ótimo. Eu acredito em você. Mas como você chega a essa conclusão (além de apenas testá-la)?

Existe algum tipo de fórmula que se pode usar para determinar quanto um sistema FAT16 pode conter?

SangoProductions
fonte
21
Há uma razão pela qual o FAT16 tem um "16" no nome. :-)
Eric Lippert
28
@EricLippert, para ser justo, a conexão entre esses 16 e os 2 GiB não é imediatamente óbvia sem saber como o FS funciona.
Joey #
18
Não estou 100% convencido de que esta questão esteja realmente relacionada a este site. Talvez deva ser movido para retrocomputing.stackexchange.com?
Jules
3
Vale a pena notar que o limite de 2 GB era uma limitação prática de como o MS-DOS e o Windows inicial lidavam com o FAT16. Conceitualmente, é possível exceder 2 GB, mas não de maneira compatível com a Microsoft.
Phyrfox
3
@ LưuVĩnhPhúc O comentário está correto. Eu disse "MS-DOS e Windows inicial". Os sistemas modernos podem usar mais de 2 GB no FAT16. Uma partição FAT16 de 4 GB não funcionará em sistemas antigos MS-DOS / Win3.1, por exemplo. E muitas fontes que declararam que o limite de 2 GB era o limite ou porque foram escritas quando esse limite era realidade, ou o tempo logo depois, onde você foi aconselhado a não fazê-lo porque sistemas um pouco mais antigos não conseguiam lidar com isso. Os sistemas posteriores podem lidar bem com isso, mas o limite de 2 GB era a regra de ouro antes de cerca de 2000, aproximadamente, e nos próximos anos depois disso, citando os limites antigos e desatualizados.
Phyrfox

Respostas:

66

O FAT16 usa 16 bits para identificar clusters. Portanto, há um máximo de 65536 clusters antes de você ficar sem identificadores, e alguns identificadores são reservados para usos que não são de arquivo. Cada arquivo ocupa pelo menos um cluster. Clusters maiores aumentam a alocação mínima por arquivo, aumentando a sobrecarga de arquivos pequenos.

O tamanho do cluster informa o volume máximo identificável. Para clusters de 32KiB, isto é 32 * 1024 * 65536 B = 2GiB.

Você pode aumentar o tamanho do cluster indefinidamente, aumentando o tamanho dos setores em disco, mas permanece limitado ao número máximo de arquivos. Você também enfrentaria problemas com o software que assumia o tamanho padrão do setor (512B)

No momento em que havia volumes físicos de ~ 2GiB prontamente disponíveis, processadores e sistemas operacionais tinham 32 bits, portanto, mudar para o FAT32 era uma escolha sensata, permitindo muito mais arquivos em pequenos agrupamentos

Caleth
fonte
4
"mas aumente a sobrecarga para arquivos pequenos" Não tenho certeza se isso ficará claro para todos, pois não tenho certeza de que todos entenderão o que se entende por "sobrecarga" nesse contexto. Acho que um exemplo ajudaria: "Por exemplo, um arquivo com um caractere ocupa 1 cluster no disco, a maioria dos quais é completamente desperdiçada. Tamanhos de cluster maiores significam mais desperdício".
Reginald Azul
3
Algumas notas esclarecedoras: 32KiB era o tamanho máximo de cluster para várias versões do DOS e Windows, mas a família Windows NT suporta tamanhos de cluster maiores desde o NT 4.0 (e, portanto, as versões de consumidor do Windows desde o XP também o suportam, pois ' baseado no kernel do NT). Isso permite tamanhos de até 16 GiB, embora, devido à ineficiência, conforme observado na resposta, seja improvável que seja útil. Você poderia plausivelmente usar tal sistema se você quisesse armazenar arquivos predominantemente grandes, especialmente se eles vieram em múltiplos do tamanho do cluster 256KiB você teria que usar ...
Jules
5
... mas você provavelmente atingirá o próximo limite, o que é um problema para o FAT16 e o ​​FAT32: o tamanho máximo do arquivo é limitado a 1 byte de 4GiB pelo fato de haver apenas 4 bytes alocados para armazená-lo no entradas de diretório. OTOH, se você tiver necessidade de armazenar um grande número de arquivos em tamanhos de 256KiB até 2GiB com capacidade para dois tamanhos e tamanho total <16GiB, o FAT16 é potencialmente o formato mais eficiente para eles.
Jules
@ Jules: Apenas potencialmente. Lembre-se de que existe uma sobrecarga por cluster. Os sistemas de arquivos que permitem armazenar execuções são mais eficientes se houver pouca fragmentação.
Deduplicator
12

Na verdade, havia várias variantes do "FAT16" ao longo dos anos com limites diferentes, mas vamos considerar a versão que persistiu do "compaq DOS 3.31" até o Windows 95.

Os volumes FAT são divididos em clusters. Cada cluster é composto de uma potência de dois números de setores. O número de setores por cluster no FAT16 é armazenado como um número assinado de 8 bits. Portanto, o máximo de setores possíveis por cluster é 64.

Os números de cluster foram armazenados como um valor não assinado de 16 bits. Limitando o total de clusters para 65536. Multiplique pelo número máximo de setores por cluster e você obterá um limite de 4194304 setores.

O tamanho (lógico) do setor dos discos rígidos é de 512 bytes. Multiplique isso pelo limite do número de setores mencionado acima e você obterá o seu limite de 2GiB. Em princípio, um meio com tamanhos de setor maiores pode suportar um volume FAT16 maior, mas não acho que isso tenha acontecido na prática.

O Windows NT alterou a interpretação do campo "setores por cluster" para não ter sinal de 8 bits. Isso permitiu uma partição 4GiB FAT16 com setores de 512 bytes (e teoricamente maior em unidades com setores maiores). O AIUI windows 98 adicionou suporte para leitura e gravação de tais partições, mas não foi possível criá-las e seus utilitários de disco não puderam repará-las.


Certamente teria sido possível fazer ajustes relativamente pequenos no formato do sistema de arquivos para suportar clusters maiores e, portanto, volumes maiores. No entanto, a MS decidiu optar pela opção mais radical de migrar para um índice de cluster de 32 bits com o Windows 95 OSR2 produzindo FAT32.

Acredito que a razão de optar pela opção mais radical foi a eficiência do espaço. Dado o tamanho típico dos arquivos na época, os clusters de 32kiB já eram um grande desperdício e os maiores teriam sido movidos.

Peter Green
fonte
4
Eu tive que pensar muito no "máximo de setores possíveis por cluster é 64", até que eu entendi: 64 é realmente a maior potência de 2 que você pode representar em um byte assinado: 128 não é possível como o máximo positivo assinado valor byte é 127.
Ralf Kleberhoff
3
@RalfKleberhoff Isso naturalmente leva a uma pergunta de acompanhamento: se você está armazenando uma potência de dois, por que armazenar o número em si e não o expoente nos dois?
Daniel Wagner
@DanielWagner Concordo absolutamente. Especialmente na época em que o FAT16 foi criado, a mudança era definitivamente uma operação mais barata do que a multiplicação. Mas, provavelmente, eles eram apenas feliz por fazê-lo funcionar, e engenharia de software não-lo por décadas no futuro ...
Ralf Kleberhoff