FAT表的作用及结构特点
FAT32的FAT表与FAT16的FAT表作用和结构大同小异,详细内容可以参见4.4.3节中的讲述,这里只强调一下针对FAT32文件系统FAT表的特点。
①FAT32的FAT表也是由FAT表项构成的,每个FAT项的大小有32位(相当于4字节)。
②虽然FAT32文件系统的FAT项是32位的,但是Windows系统只能用到26位。26位的FAT项最多可管理67 108 863个簇。
③从Windows 2000系统开始,系统能管理的簇大小可以达到128个扇区(64KB),而FAT32最多可管理的簇数为67 108 863,那么理论上FAT32能够管理的分区大小为64×67 108 863=4 294 967 232KB=4096GB=4TB。但这只是理论数值,实际上FAT32只能管理32GB的分区,原因就是Windows系统用26位的寄存器寄存文件系统中簇的个数,那么同时也就用26位的寄存器来寄存分区访问的扇区数,这样分区能够管理的扇区总数就是2的26次方,也就是67 108 864个扇区,换算一下刚好等于32GB,所以在Windows系统下不可能把一个大于32GB的分区格式化为FAT32文件系统,但第三方工具不是用26位寻址,当然可以把大于32GB的分区格式化为FAT32文件系统。
④FAT32文件系统的FAT表中,未使用的簇对应的FAT项用“00 00 00 00”这4字节表示;一个已分配的簇号对应的FAT项取值范围是十六进制的“00 00 00 02~0F FF FF FE”;十六进制“0F FF FF F0~0F FF FF F6”这个范围的取值是保留的;坏簇对应的FAT项用“0F FF FF F7”这4字节的十六进制值表示;文件结束簇对应的FAT项取值范围是十六进制的“0F FF FF F8~0F FF FF FF”,一般都取“0F FF FF FF”这个值,按照Little-Endian的字节序来写就是“FF FF FF 0F”。
FAT表的实际应用
这里再模拟一下操作系统定位FAT32文件系统FAT表的方法,首先定位FAT1,这里以图4-286中的DBR所在分区为例,定位FAT1的步骤如下:
①系统通过该分区的分区表信息,定位到其DBR扇区;
②读取DBR的BPB,通过读取0EH~0FH偏移处“DBR保留扇区数”这个参数,当前值为38(具体参数可以查看图4-288中的DBR模板);
③读取到“DBR保留扇区数”这个参数的值为38之后,跳转到该分区的38号扇区,这里就是FAT1的开始。
下面就跳转到38号扇区,具体分析这个扇区的数据结构。
该分区是刚格式化的一个分区,把分区格式化为FAT32文件系统时,格式化程序会把分配给FAT表的所有扇区都清零,然后写入0号FAT项和1号FAT项,其内容如图4-291所示。
图4-291 FAT32文件系统的FAT1
可以看出每个FAT项占用4字节,其中0号FAT项描述介质类型,其首字节为“F8”,表示介质类型为硬盘;1号FAT项为肮脏标志;2号FAT项是一个结束标志,从DBR的BPB中可以看到根目录首簇号是2,而2号簇对应的2号FAT项里是一个结束标志,说明目前根目录只占一个簇;从3号FAT项开始往后都是空FAT项,表示它们对应的簇为可用簇。
分析完FAT1,再来看看它的备份——FAT2,还以图4-286中的DBR所在分区为例,系统定位FAT2的步骤如下:
①系统通过该分区的分区表信息,定位到其DBR扇区;
②读取DBR的0EH~0FH偏移处,得到“DBR保留扇区数”的值为38;
③读取DBR的24H~27H偏移处,得到“每FAT扇区数”的值为561;
④用“DBR保留扇区数”加上“每FAT扇区数”,结果等于599,跳转到该分区的599号扇区,这里就是FAT2的开始。
FAT2的内容跟FAT1完全一样,如图4-292所示。
图4-292 FAT32文件系统的FAT2
除了0号FAT项和1号FAT项以外,如果一个FAT项为非零值,那么可能有三种情况:
①该FAT项映射的簇是一个不可用的坏簇,那么该FAT项中的值为坏簇标志(对于FAT32来说为“0F FF FF F7”);
②该FAT项映射的簇是某个文件的最后一个簇,那么该FAT项中的值为结束标志(对于FAT32来说为“0F FF FF FF”);
③该FAT项映射的簇被某个文件占用,但并不是文件的最后一个簇,那么该FAT项中的值是文件下一个簇的簇号。
举例来说,假设某个文件被分配到数据区的3、4、5三个簇中存放,第一个簇号“3”这个数值会在该文件的目录项中记录,4和5两个簇号则在FAT表中记录,记录的方法是:在3号簇所映射的3号FAT项中记录簇号“4”,在4号簇所映射的4号FAT项中记录簇号“5”,在5号簇所映射的5号FAT项中记录结束标志“0F FF FF FF”,具体情况如图4-293所示。
图4-293 FAT项实例
注意这里的数值字节序为“Little-Endian”,比如3号FAT项中的值从高位往低位读取应该是“00 00 00 04”,也就是十进制的“3”。
那么如何定位每一个FAT项在FAT表中的具体地址呢?这个很简单,在FAT32文件系统中,因为每个FAT项占用4字节,所以只要把FAT项号乘以4,得到的结果就是该FAT项在FAT表中的起始偏移地址。例如,想知道100号FAT项在FAT表中的具体地址,用100乘以4得到结果为400,那么从FAT表的开始处算起的400号偏移,就是100号FAT项在FAT表中的起始偏移地址。
另外也可以用WinHex方便地找到每一个FAT项的起始地址,菜单栏的“位置”→“转至FAT记录”就可以实现这个功能。