FAT(File Allocation Table)即文件分配表,对于FAT文件系统来讲是至关重要的一个组成部分,其主要作用及结构特点如下(如果没有特别说明,以下的作用和特点适用于FAT12、FAT16及FAT32文件系统中的FAT表)。
(1)FAT文件系统一般有两份FAT,它们由格式化程序在对分区进行格式化时创建,FAT1是活动FAT,FAT2是备份FAT。
(2)FAT1跟在DBR之后,其具体地址由DBR的BPB参数中偏移量为0EH~0FH的两字节描述;FAT2跟在FAT1之后,其地址可以用FAT1的所在扇区号加上每个FAT所占的扇区数获得。
(3)FAT表是由FAT表项构成的,我们把FAT表项简称为FAT项。每个FAT项的大小有12位(相当于1.5字节)、16位(相当于2字节)和32位(相当于4字节)三种情况,对应的分别是FAT12、FAT16和FAT32三种文件系统。
(4)每个FAT项都有一个固定的编号,这个编号从0开始,也就是说,第一个FAT项是0号FAT项,第二个FAT项是1号FAT项,以此类推。
(5)FAT表的前两个FAT项有专门的用途:0号FAT项通常用来存放分区所在的介质类型,例如硬盘的介质类型为“F8”,那么硬盘上分区的FAT表第一个FAT项就以“F8”开始;1号FAT项则用来存储文件系统的肮脏标志,表明文件系统被非法卸载或者磁盘表面存在错误。
(6)分区的数据区中每一个簇都会映射到FAT表中的唯一一个FAT项。因为0号FAT项和1号FAT项有特殊用途,无法与数据区中的簇形成映射,所以从2号FAT项开始跟数据区中的第一个簇映射,正因为如此,数据区中的第一个簇也就编号为2号簇,这也是没有0号簇和1号簇的原因,然后3号簇跟3号FAT项映射,4号簇跟4号FAT项映射,以此类推,直到数据区中的最后一个簇。
(7)分区格式化后,用户文件以簇为单位存放在数据区中,一个文件至少占用一个簇。当一个文件占用多个簇时,这些簇的簇号不一定是连续的,但这些簇号在存储该文件时就确定了顺序,即每个文件都有其特定的“簇号链”。在分区上的每一个可用的簇在FAT中有且只有一个映射FAT项,通过在对应簇号的FAT项内填入“FAT项值”来表明数据区中的该簇是已占用、空闲或是坏簇三种状态之一,这三种状态的表项取值范围见表4-22。
表4-22 FAT表中每个FAT项可取的表项值及其含义
FAT项值(12位) | FAT项值(16位) | FAT项值(32位) | 含义 |
---|---|---|---|
000H | 0000H | 0000 0000H | 未使用的簇 |
002H~FEFH | 0002H~FFEFH | 0000 0002H~0FFF FFFEH | 一个已分配的簇号 |
FF0H~FF6H | FFF0H~FFF6H | 0FFF FFF0H~0FFF FFF6H | 保留 |
FF7H | FFF7H | 0FFF FFF7H | 坏簇 |
FF8H~FFFH | FFF8H~FFFFH | 0FFF FFF8H~0FFF FFFFH | 文件结束簇 |
其中损坏的簇可以在格式化过程中,由格式化程序发现并记录在相应的FAT项中。在一个簇中,只要有一个扇区有问题,该簇就不能使用。
(8)FAT16文件系统的FAT项是16位的,也就是说每个FAT项占2字节。16位的FAT项最多可管理65 535个簇。在Windows 2000系统之前簇大小最大为64个扇区(32KB),这样,采用16位FAT的系统最多只能管理32×65 535=2 097 120KB=2048MB= 2GB的分区,对于容量超过2GB的硬盘,必须将其划分成多个不超过2GB的分区。从Windows 2000系统开始,簇大小可以达到128个扇区(64KB),FAT16文件系统就可以管理4GB的分区了,但这种分区在Windows 2000之前的系统中不可访问。
(9)综合上面的说明可以看出,FAT表的功能主要有如下三点:
①表明分区所在介质类型。FAT表的0号FAT项用来表明分区所在介质类型,该FAT项的首字节与BPB中介质描述符所对应的介质类型相同。
②表明一个文件所占用的各簇的簇链分配情况。每个簇在FAT表中映射一个FAT项,FAT项以指针的方式记录文件的簇链。
③标明坏簇和可用簇。以FAT16为例,如果分区格式化时发现坏扇区,即在相应簇的表项中写入FFF7H,表明该簇的扇区不能使用,系统就不会将它分配给用户文件。
分区上未用但可用的“空簇”的FAT项值为0000H,当需要存放新文件时,系统按一定顺序将它们分配给新文件。
要分析FAT表,就需要找到FAT表,下面模拟一下操作系统定位FAT表的方法。首先定位FAT1,这里以图4-222中的DBR所在分区为例,定位FAT1的步骤如下。
①系统通过该分区的分区表信息,定位到其DBR扇区;
②读取DBR的BPB,主要读取“DBR保留扇区数”这个参数,它在DBR的0EH~0FH偏移处,当前值为6(具体参数可以查看图4-224中的DBR模板);
③读取到“DBR保留扇区数”这个参数的值为6之后,跳转到该分区的6号扇区,这里就是FAT1的开始。
下面就跳转到6号扇区,具体分析这个扇区的数据结构。
该分区是刚格式化的一个分区,把分区格式化为FAT16文件系统时,格式化程序会把分配给FAT表的所有扇区都清零,然后写入0号FAT项和1号FAT项,其内容如图4-225所示。
可以看出每个FAT项占用2字节:其中0号FAT项描述介质类型,其首字节为“F8”,表示介质类型为硬盘;1号FAT项为肮脏标志。从2号FAT项开始往后都是空FAT项,表示它们对应的簇为可用簇。
分析完FAT1,再来看看它的备份——FAT2。还以图4-222中的DBR所在分区为例,系统定位FAT2的步骤如下:
①系统通过该分区的分区表信息,定位到其DBR扇区;
②读取DBR的0EH~0FH偏移处,得到“DBR保留扇区数”的值为6; ③读取DBR的16H~17H偏移处,得到“每FAT扇区数”的值为141;
④用“DBR保留扇区数”加上“每FAT扇区数”,结果等于147,跳转到该分区的147号扇区,这里就是FAT2的开始。
FAT2的内容与FAT1完全一样,如图4-226所示。
除了0号FAT项和1号FAT项以外,如果一个FAT项为非零值,那么可能有三种情况:
①该FAT项映射的簇是一个不可用的坏簇,那么该FAT项中的值为坏簇标志(对于FAT16来说为FF F7H);
②该FAT项映射的簇是某个文件的最后一个簇,那么该FAT项中的值为结束标志(对于FAT16来说为FF FFH);
③该FAT项映射的簇被某个文件占用,但并不是文件的最后一个簇,那么该FAT项中的值是文件下一个簇的簇号。
举例来说,假设某个文件被分配到数据区的2、3、4三个簇中存放,第一个簇号“2”这个数值会在该文件的目录项中记录(这个后面会讲到),3和4两个簇号则在FAT表中记录。记录的方法是:在2号簇所映射的2号FAT项中记录簇号“3”,在3号簇所映射的3号FAT项中记录簇号“4”,在4号簇所映射的4号FAT项中记录结束标志“FF FF”,具体情况如图4-227所示。
注意这里的数值字节序为“Little-Endian”,比如2号FAT项中的值从高位往低位读取应该是“00 03”,也就是十进制的“3”。
那么如何定位每一个FAT项在FAT表中的具体地址呢?这个很简单,在FAT16文件系统中,因为每个FAT项占用2字节,所以只要把FAT项号乘以2,得到的结果就是该FAT项在FAT表中的起始偏移地址。例如,想知道100号FAT项在FAT表中的具体地址,用100乘以2得到结果为200,那么从FAT表的开始处算起的200号偏移,就是100号FAT项在FAT表中的起始偏移地址。
另外也可以用WinHex方便地找到每一个FAT项的起始地址,菜单栏的“位置”→“转至FAT记录”命令就可以实现这个功能,如图4-228所示。
例如,想找100号FAT项在FAT表中的地址,打开菜单“位置”→“转至FAT记录”命令后输入“100”,并单击“确定”按钮即可,如图4-229所示。
单击“确定”按钮之后光标就会停在FAT表中100号FAT项的首字节处了。