我们现在有了两个可以专门讨论的专题,一个事grub专题,另一个就是使用winHex恢复硬盘数据专题。这两个专题都很有趣味性,在本讲结束后,我们就开始专门针对GRUB和winHex进行尝试性讨论。
今天主要说的内容是文件分配表FAT和文件记录表FDT。
数据的读写都要求操作系统和应用程序在硬盘上找的可操作扇区,那么这就涉及到扇区的地址问题,文件分配表FAT就是记录扇区地址的。硬盘的扇区数目庞大,为了不造成FAT表的体积过大,那么硬盘扇区采用分组管理,分作的过程就是分簇。高级格式化程序就是完成这一过程的。大家思考一下,那么低级格式化主要影响硬盘的那些数据结构呢?
簇的大小是由分区的大小和格式来决定的。文件在磁盘上是采取簇链的形式来检索和管理的。
我们来看一下在磁盘上对文件进行增删改查是如何进行的。这里提供一个思考问题,簇链的数据结构怎样实现,才能实现快速查找,效率最高。
当在磁盘上读取文件的时候,首先从文件的目录中找到该文件的目录登记项,继而从目录项的有关字段,查到分配给该文件的第一个簇号,根据第一簇号的内容可以计算出两组数据。其中一组数据,指出文件在数据区DATA里的第一簇扇区首地址,从首地址开始数据是连续存放的。连续存放多少扇区是由分区的特征决定的。另一组数据指出FAT表内簇登记项的地址,如果其值是结束标志fffH(FAT16格式)或ffffff0fH(FAT32格式)说明文件到此已经结束。如果不是结束标志,则该登记项的值为第二簇号,根据此又可以计算出两组数据,继而制定文件在数据区DATA里第二簇扇区首地址和FAT表内第2个簇登记项。
继续重复上面的过程,就得到全部数据,以及文件在FAT表里的所有簇登记项的地址。
大家可以写一下这个过程。
当建立一个文件时,首先检索FAT表,找到可用簇,可用簇就是登记项值为0000H(FAT16)或00000000H(FAT32)。将该簇作为起始簇,写入文件目录表FDT的相关登记项中。然后检索后面的可用簇,找到以后的将其簇号写入第一个可用簇项内。
重复以上过程,将满足文件长度所需的簇数全部找到。使每一个簇项的値指向下一个所需的簇项,在最后的簇登记项内写入结束标志。于是一条能够检索这个文件的完整簇链完成了。
当需要对文件扩展的时候,先检索FAT表,找到可用簇。将簇项的内容置为结束标志,并将文件原来的最后簇项值修改为指向可用簇。以此类推,直到完成扩展。
删除文件的时候,除了文件目录中表登记项的第一个字节改为e5H,还要把该文件在FAT表的簇链中所对应的项全部清零,这些清零的项又可以供他人其他文件使用。不过在删除文件结束之后,目录登记项的其他字段依然保存完好,只是文件名的第一字节变成了e5H,并且文件存储在扇区里的所有数据依然存在。这时只要FAT表中被清零的簇项没有被新文件使用,就可以将删除的文件恢复。
FAT表记录文件对磁盘的使用情况,系统保留的控制信息并不由FAT表记录。
这些过程很重要,假如我们尝试恢复删除的数据,这些过程必须很入微的理解,建议画一画草图理解。
文件目录表FDT,是由高级格式化程序在特定扇区上建立的。根据偏移量给出下表,说明对应的数据在FDT表中所传达的文件信息。
00H 8字节 文件名
08H 3字节 扩展名
0bH 1字节 属性
0cH 10字节 DOS系统保留
16H 2字节 建立和修改的最后时间
18H 2字节 建立或修改的最后日期
1aH 2字节 起始簇号
1cH 4字节 文件长度
数据区DATA
data的所有扇区都划分为以簇为单位的逻辑结构和FAT表里的簇登记项一一对应。在数据严重受损的时候,我们可能尝试对DATA区数据的全部复制。
至此,磁盘的数据结构全部介绍完毕,在以后的winHex专题,我们还将继续探讨有关问题,比如扇区寻址等。使用相关工具或者编程技术对数据恢复技术做一个简单的尝试。