为什么FAT16不能存储超过2 GB?


25

我去查找FAT16信息的所有站点都声明性地声明它不能分配超过2 GB的空间。好。大。我相信你。但是,您如何得出这个结论(不仅仅是测试它)?

是否可以使用某种公式来确定FAT16系统可以容纳多少?


21
FAT16名称中有一个“ 16”是有原因的。:-)
埃里克·利珀特

28
@EricLippert,说句公道话,在不知道FS如何工作的情况下,这16和2 GiB之间的联系不是很明显。
乔伊'18

18
我不是100%确信此问题实际上是该网站的主题。也许应该将其移至retrocomputing.stackexchange.com?
Jules '18

3
值得注意的是2GB的限制是MS-DOS和早期Windows如何处理FAT16的实际限制。从概念上讲可能会超过2GB,但不能以Microsoft兼容的方式。
phyrfox

3
@LưuVĩnhPhúc评论正确。我确实说过“ MS-DOS和早期的Windows”。现代系统可以在FAT16中使用超过2GB的空间。例如,4GB FAT16分区在旧的MS-DOS / Win3.1系统中不起作用。许多资料指出2GB是限制,或者是因为在达到该限制时就写了2GB,或者是在不久之后的那段时间,因为有些较旧的系统无法处理,所以建议您不要这样做。后来的系统可以很好地处理它,但是2GB的限制是大约2000年前的经验法则,在此之后的几年中,它引用了旧的过时的限制。
phyrfox '18年

Answers:


66

FAT16使用16位来识别群集。因此,在标识符用尽之前,最多有65536个群集,并且某些标识符保留供非文件使用。每个文件至少占用一个群集。较大的群集会增加每个文件的最小分配,从而增加小型文件的开销。

然后,群集大小会告诉您最大可识别的卷。对于32KiB群集,即32 * 1024 * 65536 B = 2GiB。

可以通过增加磁盘上扇区的大小来无限期地增加群集的大小,但是仍然限于最大文件数。您还会遇到假定默认扇区大小为(512B)的软件的问题。

在大约2GiB的物理量可用的时候,处理器和操作系统是32位的,因此迁移到FAT32是一个明智的选择,在小型群集中允许更多文件


4
“但是增加了小文件的开销”不确定每个人是否都清楚,因为我不确定每个人都将理解这种情况下“开销”的含义。我认为,一个示例会有所帮助:“例如,一个文件中包含一个字符的文件在磁盘上占用了1个群集,其中大多数群集完全被浪费了。较大的群集大小意味着更多的浪费。”
Reginald Blue

3
有两个澄清的说明:32KiB是各种版本的DOS和Windows的最大群集大小,但是Windows NT家族自NT 4.0起就支持更大的群集大小(因此,自XP以来的消费者版本的Windows也支持它,因为它们重新基于NT内核)。尽管由于答案中指出的效率低下,这最多允许16GiB的大小,但这不太可能有用。如果您想存储主要是大文件,则可以合理地使用这样的系统,尤其是当它们以256KiB集群大小的倍数来使用时,您必须使用...
Jules

5
...但是您可能会达到下一个限制,这对FAT16和FAT32都是一个问题:最大的文件大小被限制为4GiB少1个字节,因为只有4个字节分配给它存储目录条目。OTOH,如果您碰巧需要存储大量文件,大小约为256KiB到2GiB,且具有2的幂,并且总大小小于16GiB,则FAT16可能是最有效的格式。
Jules '18

@朱尔斯:只有可能。请记住,每个集群都有开销。如果碎片很少,则允许存储运行的文件系统效率更高。
Deduplicator

12

多年来,实际上存在“ FAT16”的多个变体,并具有不同的限制,但让我们考虑从“ compaq DOS 3.31”到Windows 95的版本。

FAT卷分为多个簇。每个群集由两个扇区的幂组成。FAT16上每个群集的扇区数存储为8位带符号数。因此,每个群集的最大扇区数为64。

群集号存储为16位无符号值。将总群集数限制为65536。将其乘以每个群集的最大扇区数,即可得到4194304个扇区的限制。

硬盘驱动器的(逻辑)扇区大小为512字节。将其乘以上面提到的扇区数限制,即可得到2GiB限制。原则上,具有较大扇区大小的介质可以支持更大的FAT16量,但我认为这实际上没有发生。

Windows NT将“每个群集的扇区”字段的解释更改为无符号的8位。这允许具有512字节扇区的4GiB FAT16分区(理论上在具有更大扇区的驱动器上更大)。AIUI Windows 98增加了对读写此类分区的支持,但是它无法创建它们,并且磁盘实用程序无法修复它们。


当然可以对文件系统格式进行较小的调整,以支持更大的群集,从而支持更大的卷。但是,MS决定采用更根本的选择,即使用Windows 95 OSR2生成FAT32迁移到32位群集索引。

我相信选择更激进的选择的原因是空间效率。考虑到当时的典型文件大小,32kiB集群已经非常浪费,甚至更大的集群也会迁移。


4
我不得不认真考虑“每个群集的最大扇区数是64”,直到得到它:64实际上是您可以在一个有符号字节中表示的2的最大幂:不可能是128,因为最大正符号字节值为
127。–拉尔夫·克莱伯霍夫

3
@RalfKleberhoff当然,这自然会引起一个后续问题:如果存储的是2的幂,为什么还要存储数字本身而不是2的指数?
丹尼尔·瓦格纳

@DanielWagner我完全同意。特别是在创建FAT16时,绝对比乘法便宜。但是可能他们只是很乐意让它运行,而不是未来数十年的软件工程……
Ralf Kleberhoff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.