1. 主页
  2. 文档
  3. exFAT文件系统结构
  4. 文件分配表(FAT表)

文件分配表(FAT表)

字段名称 偏移(字节) 大小(字节) 描述或取值
FAT表项0 0 4 媒介类型0xFFFFFFF8硬盘
FAT表项1 4 4 常量0xFFFFFFFF
FAT表项2 8 4 第一簇
最后FAT表项 (簇数+1)*4 4 文件最后一簇
空闲空间 (簇数+2)*4 FAT表剩下的部分 扇区剩下的部分
注意:簇集的第一个簇是2号簇,没有0号簇和1号簇.如果簇数是10,所占的簇可能是2号簇到11号簇,使用的FAT表可能为12个表项(每个表项使用32位).

表7 文件分配表结构

FAT文件系统家族包括FAT12,FAT16,FAT32和exFAT。Carrie,2005的260页解释了FAT表的两种作用,一个是描述当前簇的分配状态,另外一个是找出文件或者目录簇链的下一个簇。在exFAT文件系统中FAT表的这两个作用和传统的FAT不一样。

在exFAT中,FAT表不再用作描述一个簇的分配状态,像NTFS文件系统一样,exFAT使用簇位图分配表来记录簇的分配情况。就下一簇的位置来说,如果文件或目录有碎片,exFAT文件系统中的FAT表和传统的FAT文件系统类似,将使用FAT表记录簇的位置。如果文件没有碎片,则不使用FAT表记录簇的信息。

理论上,这种变化可以提高潜在的I/O操作速度。在FAT32文件系统中的写入操作中,分配或读取每一个簇时,必须访问FAT表。在exFAT中,这种操作只用访问簇位图分配表中的一位。只要文件没有碎片,FAT表是不需要更新的。如果写一个文件,即使在FAT表中描述这个文件所有簇的FAT项已经有数据了(可能是其它已经删除的文件的FAT记录),这些记录单元甚至不用清0,因为在目录扩展流项(8.9章介绍)中有一个标志指示FAT表是无效的。在exFAT文件系统中读取或存储一个没有碎片的文件,不需要访问FAT表或是位图分配表,可以减少文件系统的I/O操作。

FAT表只是简单的用于记录簇位置的一个列表。它表明一个文件所占用的各簇的簇链分配情况。它是一个单项链表,每个簇在FAT表中映射一个FAT项,FAT项用指针的方式记录文件的簇链。

FAT表的前两个FAT项是预定的。第一个FAT项是媒介类型,设置成0xF8表明是一个硬盘。FAT12和FAT16文件系统可以支持软盘,支持的媒介如表2所示。exFAT不支持软盘。图4显示了在支持exFAT的Server 2008系统中格式化一个软盘的结果。


图4 试图格式化一个1.44寸软盘为exFAT格式


图5  Winhex显示的16个FAT表项

图5是WinHex显示的一个exFAT文件系统的前16个FAT表。第一个表项(表项0)是媒介描述,它的值是0xFFFFFFF8。第二个表项(表项1)的值是0xFFFFFFFF。在所有的exFAT文件系统中这两个表项的值是不变的。因为前两个表项是保留的不代表任何簇信息,    exFAT文件系统的首簇位于表项2。在这个例子中,表项2,3,4是文件EOF结束标志(0xFFFFFFFF),文件系统的2号簇是位图分配表的首簇,3号簇是大写字符表的首簇,4号簇是根目录的第一个簇。这三个区域是文件系统对磁盘初始化进行格式化操作产生的而不是常规文件系统操作(例如读写,删除)的一部分。

大写字符表和位图分配表的大小是静态的,这些区域不会产生碎片,根目录是可以增长的,可能会产生碎片。2.1章提供的VBR定义中描述了“根目录首簇号”,需要注意的是:它没有等效的“没有FAT链”标志,同时在8.3和8.4章也可以说明,位图分配表和大写字符表也没有这个标志。没有任何文档资档说明是否用FAT表来描述这三个区域的簇链,因此假定它们是链式的,对这3个区域的FAT描述与传统的FAT(例如FAT32等)操作一样。


图6 程序模拟Chkdsk结果

作为分析FAT表结构的一部分,程序读取所有的FAT表项(不包括前两个表项)列出它们的总数如图6所示。如图5所示,这是一个64M的USB驱动器,它的簇大小为128KB,它有3个大文件,占文件系统的87%空间,因此只有61个簇是空闲的,文件系统一共有497个簇,程序计算了零和非零的FAT表项,有494个表项的内容是零,其它三个非零项是三个EOF(结束)标记。

另外一个USB驱动器中有436个簇,FAT表除了三个簇使用外没有记录任何东西。这证明FAT表不是用来描述所有文件的簇链的。理论上在exFAT中读一个文件的时候同使用一个FAT表的文件系统相比,性能影响不大。在exFAT中如果文件是连续的,那就不用查阅FAT表。这可以减少读FAT表项产生的I/O操作,可以用简单的I/O一次读取簇集中多个簇的信息。

和FAT有关的几个特殊值:

l         0x00000000-没有使用

l         0x00000001-非正常值

l         0xFFFFFFF6-最大值

l         0xFFFFFFF7-坏簇

l         0xFFFFFFF8-媒介描述

l         0xFFFFFFF9~0xFFFFFFFE-没有定义

l         0xFFFFFFFF-文件结束(EOF)

通常FAT表项的值可能是零,表明没有表链。在exFAT中,首先要注意的是表链在目录项扩展流中是否存在记录。如果没有表链,在目录扩展流项目的辅助标志有一个位表明FAT表链是无效的。

因为簇索引开始于第2簇,没有0簇和1簇,因此没有FAT表项的值是1的。簇的有效值的取值范围是2到“总簇数+1”。例如,如果有一个文件10个簇,则范围就是2~11簇。

总簇数的最大值+1是0xFFFFFFF6。这说明FAT表项的数目为232-11,这是可用32位FAT表记录的最大值也是卷内簇的最大数目。0xFFFFFFF7用来描述坏簇,0xFFFFFFFF用来记录FAT簇链的结束标志(EOF)。这和FAT家族的传统的版本是一致的。如果FAT表描述了一个坏簇,同时VBR中的“媒介失效”位也设置为1。

exFAT的最大FAT表数目是2,但是版本1.0不支持Transactional exFAT(TexFAT),因此只定义了一个FAT表。FAT表的起始地址,FAT表的大小,FAT表的数目都在VBR中定义。如果FAT表数目定义成2,则FAT1结束以后的下一个扇区就是FAT2的开始地址,FAT1和FAT2的大小相同。如果有两个FAT表,在VBR中定义哪个FAT表是活动的(见2.1章)。


图7 扩展FAT文件系统(exFAT)例子

使用如图7所示的例子来说明系统如何应用FAT表链。应用FAT表有两个主要的指针,第一个是VBR中的MBS指定的“FAT表起始扇区号”,这个例子假定使用的是一个FAT表。“FAT表偏移”指向FAT表的第一个项,也就是媒介描述符。

第二个指针是目录扩展流项目中定义的文件“第一簇”指针,在这个例子中,数据的第一簇位于簇链表的40簇。

处理完簇集40簇的数据后,系统需要访问文件的下一簇。系统先检查目录扩展流项得知FAT表是有效的,系统访问FAT表项40的内容(FAT表项40位于FAT表的偏移160字节,因为一个FAT表项是32位的,占用4个字节)。FAT表项40的内容是41,这是文件链表的下一个簇。读取并处理簇集41簇的内容,然后访问FAT表的41项。FAT表41项的内容是80,读取并处理簇集80簇的数据后再读取FAT表项80的内容。

FAT表项80的内容是101,读取并处理簇集101簇的数据后再读取FAT表项101的内容。FAT表项101的内容是EOF标志,也就是表链结束的标志,文件就没有其它簇了。理论上FAT表不需要包括EOF标志,因为系统对文件的处理读取到了目录项中记录的数据长度就停止读取了。到此FAT表链就完成了。

我们要如何帮助您?

评论 抢沙发

评论前必须登录!