| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
文件分配表
(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 表项:
图 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 文件分配表中的每个簇号可取的表项值及其含义
从表 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 。 |
[文件分配表(FAT)及其结构]
最新推荐文章于 2024-07-06 10:07:51 发布