FAT32技术内幕 早在1987年时，个人电脑的世界中就出现了一个危机。微软公司十年前为自己的DOS所发展出来的FAT文件系统已经到达了它的极限。当时的FAT文件系统只能支持最多32MB的硬盘，因此用户都无法利用新一代高密度硬盘多出来的容量。而一些独立厂商便使用它们自己的程序以便存取更高的容量，整个危机一直到微软推出了DOS 4.0 之后，才暂时地得到了解决。 微软的DOS 4.0 大幅改变了文件系统的架构，使得程序得以处理高达128MB的容量；而其稍后所做的扩充又将整个处理上限提高到了2GB。在当时，这个容量看起来似乎很大，很难想像有谁会用到它。但是个人电脑的发展使我们不得不相信这样的真理 ：“看起来远远超过需求”的事物很快的会变成“完全赶不上需求”。事实上容量超过 2.5GB的磁盘现在已随处可见。
现在微软已经针对Windows 95系统，发展出了FAT32，一个新的扩充型FAT文件系统。本文将回顾FAT文件系统的一般架构，然后再探讨FAT32到底增加了哪些东西。为了避免混淆，我们使用 FAT16来表示先前旧版的16位元文件系统。
磁盘分区
当磁盘被格式化之后，文件系统需要用到一些特殊的区域来组织它自身的资料，包括：主引导记录 (Master Boot Record)、磁盘分区表(Partition Table)、引导纪录(Boot Reco rd)、文件分配表(File Allocation Table，这也是FAT的名称由来)以及根目录 (Root Directory)。在低阶的部份，磁盘被分割成一块块512字节的区域，称为扇区(Sector)。FAT 文 件系统将数个扇区合并成一个簇 (Cluster)，作为分配文件时的基本单位，簇里的扇区数目必须是2的次方。通常你可以藉著将磁盘的容量除以64K（65,536 字节），再将得出来的数据进位到最接近2的次方数以求得簇大小。例如一个1.2GB的磁盘其簇的大小可以由 1.2GB(1,258,291.2K)除以64k得到19.2K，再进位到最接近的2的次方数为32KB。
FAT链
FAT是一个记录磁盘上文件大小及其所对映的簇的资料库。它对每一个簇都有一个相对的记录表。最前面两个记录包含了 FAT本身的资料，第三个及后续的记录表则被分配为文件所使用的磁盘空间。
FAT记录表会包含一些特殊的值∶
＊簇为空白的，表示没有任何文件使用到它（在FAT16时其值为0000H)
＊簇包含了一个或数个不可使用的受损扇区（在FAT16时其值为FFF7H)
＊此簇为文件的最后一个簇 (在FAT16时其值为FFFFH)
如果簇已经被使用但不是文件的最后一个簇，那么FAT记录表会记录其下一个簇的位置 。
每一个目录，无论是根目录还是子目录，也都是一个资料库。一个 DOS的目录针对每一个文件都会有一个主要的记录表 (Windows 95 使用额外的记录表来记录长文件名）。在目录 中的每一个文件的记录表都包含了许多的栏位。其中某些栏位，如名称(Name)、扩展名 ( Extension)、文件大小(Size)、日期(Date)以及时间(Time)等，可以用DOS中的DIR命令来显示。但是FAT文件系统用到的是那些DIR命令无法显示的栏位——文件所配置到的第一个簇号码。
当我们要该问某个文件的内容时，操作系统会到此文件的目录记录表去寻找它的第一个簇号，然后再到FAT记录表里去找在此链(Chain)里的下一个簇，直到找到文件的最后一个簇 为止，操作系统可以精确的计算哪些簇属于这个文件及其先后顺序。由此方式，操作系统可以提供程序所要求之文件的任何部份。这种组织文件的方式称为FAT链(FAT Chain)。
在FAT文件系统中，文件会被分配到整数单位的簇。在一个每一簇大小为32KB的1.2GB磁盘中，一个只包含几个字节的文件在磁盘中仍然要占上32kB的空间。在簇中没有用到的部份 称为耗损 (Slack)。小文件的耗损几乎与整个簇相当；平均来说，一个文件会有一半左右的耗损。
在一个每一簇为16kB的850MB硬盘中，如果平均文件大小为50kB的话，大概有16%硬盘空间被浪费掉了。一般硬盘压缩程序，如DriveSpace，增加磁盘容量的方式之一是将那些虚损 的空间转换出来以供其它文件使用。
计算扇区与簇
最早用在DOS 1.0上使用的是12-Bit FAT文件系统。从DOS 2.0开始，由于加入了对硬盘的支援，因此改用16位FAT记录方式。而在1987年时碰到了第一个问题，这个问题的根源在于操作系统低阶呼叫的方式，因为当时的DOS操作系统是以16位为参数来记录扇区数目以便存取文件，而16位的记录方式最多只能有65,536个不同的数值，而65,536乘上每个扇区为512字节,则最多只能寻址到32MB。这是操作系统所能记录的最多扇区数目。而当时的硬盘容量已经开始超出这个数目，因而从DOS 4.0开始，改以32位方式来记录低阶扇区数目。
目前DOS的2GB容量上限严格来讲并不是操作系统的问题，而是现有应用程序的问题。一个硬盘当其容量超过2GB时，其簇大小为64KB，也就是65,536字节。但是16位的最大值只到65,535，超过64KB就变得太大了。
在FAT16的系统中，操作系统本身会在其设置的磁盘参数表中用一个字节储存每个簇包含多少扇区的数目。这个数字必须是2的次方，而其值不能大于256。因此簇的最大可能大小为128个扇区，也就是64KB。所以即使没有2GB的上限，FAT16也仅能使用在4GB以下容量的硬盘之中。在FAT32系统上市之后，FAT记录表及扇区数目现在都变成了32位。这表示你可以存取到的最大的硬盘空间为2的32次方（也就是4,294,967,296)乘上每扇区512字节，结果得到2Tera字节 (2,199,023,255,552字节)。
减少无谓的耗损
现在由于最大的簇数目跟最大扇区数目已经一样，你可能希望FAT32可以减低无谓的损耗空间，将簇的数目直接对映到每一个扇区。目前 FAT32的规格将 8GB容量以下硬盘的簇大 小定为4KB。
这么做的主要原因是FAT本身大小的问题。因为操作系统会保存两份 FAT记录，所以每个簇的FAT记录表会占据8字节空间。在一个2GB的硬盘中，如果每个簇大小都只有512字节 的话，FAT记录表将会占去32MB的硬盘空间。然而如果每个簇大小为4KB的话，这两份FAT记录表将会只占掉4MB的空间，足足节省了28MB。
还有一个原因是硬盘效率的问题。VCACHE，这个内建的磁盘快速存取程序，会尽其可能的将整个FAT记录放在RAM中以便增加磁盘机的存取速度。很显然地, 存一个2MB大小的FAT记录会比放一个16MB FAT记录来得容易许多。你可能会担心要存取一个这么大数目的簇跟双份的FAT记录表会使的VCACHE的效率不佳，但是根据微软的说法，由于FAT32使用了新的快速存取方式，因此其整体效能变得更好。
FAT32的其它改变
为了容纳增加以后可能出现的大量簇数目，每一个文件的目录记录表中的簇开始位置必须用到4字节来记录，而不再像FAT16只需要2字节。传统上，每个目录记录表皆是一个3 2 字节的记录。在其中间有10个字节(bytes 12到21)，微软将其保留下来以供其未来扩充之用。现在其中两个字节被用来容纳FAT32扩充簇数目之后所需的额外空间。
操作系统虽然在硬盘上保存了两份 FAT记录，但是只使用到一份而已。有了FAT32后，操作系统现在可以使用其中任何一份。另外一项改变是根目录的改变，以前根目录必须放在特定的位置且只能占用固定的硬盘容量，现在则可以跟子目录一样随着需要增减。而根目录的数目不再有任何限制。由于每个长文件名要用掉好几个目录记录，因此这项改变显得格外重要。
可移动式根目录以及可使用任意一份的FAT记录表的结合，使得FAT32可以提供更平顺且动态的硬盘分区能力，譬如它可以为了其它操作系统挪出空间来使用。这个新方法比起在FAT16之下用独立厂商的公用程序来分区硬盘来得更为安全。
（何春林）