文件分配表(FAT)及其结构

文件分配表(FAT)是文件管理系统用来给每个文件分配磁盘物理空间的表格,它告诉操作系统,文件存放在磁盘的什么地方。
1.FAT表的大小及位置
FAT在磁盘上是安排在紧接DOS引导扇区(DBR)之后的。在FAT16系统中,它总是从DOS的逻辑1扇区开始。
在磁盘上共有FAT表的两个拷贝(一个是基本FAT表,另一个是FAT表的备份),两者在磁盘上前后紧排在一起,其大小根据分区的大小不同而变化,FAT16中的文件分配表情况可参见表6-3中的BPB信息项。
FAT表之后紧接着是根目录,根目录之后是数据区。
图6-1说明了常用磁盘上各数据区中DBR、FAT及根目录FDT的相对位置和大小。在硬盘中,FAT16的文件分配表(FAT)仍然是存放在逻辑1扇区开始的若干个扇区内,一个文件分配表占用多少个扇区根据硬盘分区和逻辑盘容量大小情况的不同而不同。
2.文件的簇号链
磁盘格式化后,用户文件是以簇为单位存放在数据区中,一个文件至少占用一个簇。当一个文件占用多个簇时,这些簇的簇号不一定是连续,但这些簇号间有由存储该文件时确定了的顺序,即每个文件都有其特定的“簇号链”。
设一个磁盘文件长度为4个簇,其首簇号为n1,簇号链为“n1->n4->n3->n2”。该文件在FAT中的簇号链,以及其逻辑空间和物理存放空间的对应关系如图6-4所示。
FAT表项:

第00簇
 
···
n4
···
FFF
···
n2
···
n3
···
该磁盘文件所占据的逻辑空间:
···
        ···
第n1簇 簇号:n1------------>n4------------>n3-------------->n2
···                                        文件所占据的物理空间
第n2簇                                             不一定连续
··· 该磁盘文件所占据的物理空间:
第n3簇
···   ···   ···   ···   ···
··· 簇号:    n1            n2             n3            n4 
第n4簇  
···  


                       图6-4FAT表中的文件簇链对应关系示意图
在磁盘上的每一个可用的簇在FAT中就只有一个登记项,通过在对应簇号的登记项内填入“表项值”来表明数据区中的该簇是否占用、空闲或是已损坏的。损坏的簇是在格式化的过程中,通过FORMAT命令发现。在一个簇中,只要有一个扇区有问题,该簇就不能够使用。
磁盘上的簇在FAT中的表项占12、16或32位。在FAT16文件系统中,每簇在FAT中所取表项值是占12位还是16位与所用磁盘的容量有关,12位表项值可表示4096个簇,若磁盘的簇数大于4096,则用16位表项值。一般来说,软盘和小于20740个扇区(10MB)的硬盘DOS分区可用12位映射一个簇,如多于20740个扇区的硬盘分区,则采用16位的FAT。FAT12和FAT16表项的组成如图6-5和6-6所示。
                  

                                    图6-5 12位FAT表项的组成

                              
                                    图6-6 16位FAT表项的组成
FAT文件系统是以簇为单位给文件分配磁盘空间的,每个簇在FAT表中占有一个登记项。所以,在FAT表中,簇编号也即为登记项的编号。每一个登记项作为一个簇的标志信息按照FAT12、FAT16和FAT32结构的不同分别为1.5个字节、2个字节和4个字节。该标志信息可取的表项值及其含义如表6-5所示。
表6-5文件分配表中的每个簇号可取的表项值及其含义

表项值(12位) 表项值(16位) 表项值(32位) 簇描述信息含义
000H 0000H 00000000H "0"值(未分配使用)
001H--FEFH 0001--FFEFH 00000001--FFFFFFEFH "一个簇号"(已占用)
FF0H--FF6H FFF0--FFF6H FFFFFFF0--FFFFFFF6H 保留
FF7H FFF7H FFFFFFF7H 坏簇
FF8H--FFFH FFF8H--FFFFH FFFFFFF8--FFFFFFFFH "EOF"(文件结束簇)


从表6-5中可看出,簇在FAT中的占用1.5个字节、2个字节或4个字节的登记项必须是下列值之一:
·一个“0”值,表示这个簇未被分配使用。
·一个“001H~FEFH”、“0001H~FFEFH”或“00000001H~FFFFFFEFH”之间的值,表示该簇已经被占用,且该值即是该簇所在文件中下一个簇号的指针。
·一个“BAD”(FF7H、FFF7H或FFFFFFF7H),表明该簇有坏扇区,不能使用。
一个“EOF”(FF8H~FFFH、FFF8H~FFFFH或FFFFFFF8H~FFFFFFFFH之间的任一值),表明该簇是文件中的最后一簇。
在FAT的簇登记项中,0号登记项和1号登记项是表头,簇的登记项从2号开始。系统隐含文件IO.SYS所在的首簇号总是0002。
3.FAT表的组成格式及功能
综上所述,现将FAT表的组成格式及功能总结如下:
·表明磁盘类型。FAT的第0簇和第1簇为保留簇,其中第0字节(首字节)表示磁盘类型,其值与BPB中磁介质说明符对应的磁盘类型相同。
·表明一个文件所占用各簇的簇链分配情况。FAT从002簇开始分配给文件。表项值“001H--FEFH”、“0001H--FFEFH”或“00000001H--FFFFFFEFH”中的任一值表明文件的下一簇号。文件的起始簇号由文件目录表(FDT)中每个目录登记项的第26、27字节决定,作为FAT的入口,起始簇号在FAT中的表项值即文件的第2簇号,第二簇号的表项值即第3簇号,依此类推,直到表项值为FF8H--FFFH、FFF8H--FFFFH或FFFFFFF8H--FFFFFFFFH,表示该簇为文件的最后一簇。
·标明坏簇和可用簇。若软盘格式化时发现坏扇区,即在相应簇的表项中写入FF7H(或FFF7H),表明该扇区所在簇不能使用,DOS就不会将它分配给用户文件。
磁盘上未用,但可用的“空簇”的表项值为000H(或0000H)。当需要存放新文件时,文件管理系统将它们按一定顺序分配给新文件。
虽然FAT表记录了文件所用的磁盘空间信息,但是DOS引导区、两个FAT表、文件目录区等并不由FAT表中的簇表示。
4.FAT表登记项与文件的簇链关系
以FAT16文件系统的16位登记项为例,文件寻找簇链的计算步骤为:
·假如我们已经从文件目录表(FDT)中查得该文件的起始簇号。
·将该起始簇号换为10进制数a,a即为查找下一簇号的本簇号。
·a*2(若是12位FAT项,则a*1.5的乘积取整),即得到FAT中的相对位移b该位置存放文件簇链的下一簇号。
·从该相对位移b开始取一个字(低位在前,高位在后。如果是12位的FAT项,则按以下原则:若本簇号a为偶数,则保留该字低12位,否则保留高12位)。
·重复以上簇链的查找过程,直至找到其值为FF8--FFF的簇号。
5.文件簇链的操作实例
下面用一个例子来说明文件簇链的查找过程:
·假如已经从FDT中知道一个在1.44MB软盘上文件11.TXT的起始簇号为02。
·a=02即为查找下一簇号的本簇号。
用DEBUG调出第一个FAT的内容如下:
A:/>DEBUG
-L CS:0 0 1 7 (将A盘第1扇区开始的7个扇区的根目录FAT读入内存)
-D CS:0 (显示FAT的部分内容)
0F74:0000 F0 FF FF 03 40 00 FF 5F-01 07 F0 FF FF FF FF FF ....@.._........
0F74:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ...............o
......
·由文件起始簇号2*1.5=3.0,取整后得3,即0003开始的一个字中存放下一簇号。
·从FAT的第3字节开始,取一个字4003。
·由于本簇号2为偶数,则保留低12位,003(第3簇)。
·重复以上的查找过程:
3*1.5=4.5,4.5取整后为4,即0004开始的一个字中存放下一簇号。
从FAT的第4字节开始,取一个字0040。
由于本簇号3为基数,则保留低12位,004(第4簇)。
·再重复以上的查找过程:
4*1.5=6,即0006开始的饿一个字中存放下一簇号。
从FAT的第6字节开始,取一个字5FFFH。
由于本簇号4为偶数,则保留低12位,FFFH(表明第4簇为结束簇)。
由此得到该文件的簇号链为:2=>3=>4。

你可能感兴趣的:(文件系统)