NTFS文件系统扇区存储探秘
上QQ阅读APP看书,第一时间看更新

2FAT文件系统的扇区分配

2.1 FAT16的扇区分配

FAT16文件系统由于能被目前所有的操作系统所识别,所以在硬盘分区时使用得极为普遍。特别是安装多操作系统的硬盘,有时必须在主分区(C盘)使用FAT16文件系统。如果使用不能被某个操作系统识别的文件系统,则该操作系统就不能顺利安装。

现在的硬盘越来越大,硬盘上安装的应用软件越来越多,而适合这些应用软件运行的操作系统不尽相同,特别是编程人员使用的计算机,一般都安装两三个操作系统。用于多操作系统引导的有关文件,必须存储在FAT 1 6格式的分区中,才能被不同的操作系统加载使用。

所以在当前主流文件系统中,尽管FAT16存在着许多缺点,但仍然得到了广泛的使用。

FAT16文件系统的磁盘扇区是这样分配的。

在使用FAT16文件系统的分区内,第一个扇区是分区表(C盘)和分区链表(D盘和以后的盘),其中C盘的第一个扇区还包含主引导记录。严格地讲,分区表所在的扇区不属于任何分区,但是从物理空间上它们又靠得很近,为了今后在计算扇区编号时比较容易找到规律,暂且将分区表这样划分。

之后是系统隐藏扇区,包括含有分区表或分区链表在内的扇区,一共占用63个扇区,实际上就是一个磁道所包含的扇区。

系统隐藏扇区之后是分区引导记录,占用一个扇区。

再往后是两份相同的文件分配表FAT1和FAT2,每份FAT表占用多少个扇区,由分区的大小而定,分区大所占用的扇区就多,具体数值可从分区引导记录的BPB表中查得,查找方法可参考第1章的内容。

紧接FAT表之后是文件目录表FDT,固定占用32个扇区,每个扇区可容纳16个登记项,每个登记项的长度是32字节。

FDT表之后是数据区DATA,数据区内的扇区是按照簇来管理的,簇的大小由分区大小而定,它们之间的关系可参考第1章的内容。

扇区分配的情况见表2-1。

表2-1 FAT16文件系统的扇区分配

2.2 FAT16扇区寻址实例分析

详细了解文件系统的扇区分配是排除硬盘逻辑故障的重要基础。下面以作者使用的硬盘为例,介绍FAT16文件系统的扇区地址的寻址计算方法。

在进行扇区寻址和计算的过程中,需要用到后面《工具篇》中介绍的一些工具程序,本章先使用这些程序的执行结果,程序的详细运行方法在后面的章节中再作介绍。

作者使用的计算机上挂接了两块硬盘,为了在以后进行扇区扫描时节省时间,特意选用了两块小容量的硬盘。一块容量是6.2GB,接在第一IDE接口上,硬盘编号是“0”。另一块容量是40GB,接在第二IDE接口上,硬盘编号是“1”。

现在将1号硬盘作为主要操作对象,该硬盘划分成C、D、E、F、G、H、I七个逻辑驱动器,将0号硬盘作为辅助操作对象。1号硬盘的前五个逻辑驱动器的容量都是2GB,除了F盘使用NTFS文件系统,其余的C、D、E、G盘都使用FAT16文件系统。后两个逻辑驱动器使用FAT32文件系统,H盘的容量是10GB,I盘的容量是18GB。

下面以E盘为例,介绍FAT16文件系统的扇区分配。

运行“备份系统扇区数据.EXE”程序,就可以将硬盘上所有的逻辑驱动器的系统扇区数据,备份到文件中进行保存。每个逻辑驱动器备份两个扇区,其中一个是存储分区表或分区链表的扇区,另一个是存储分区引导记录的扇区。当分区引导记录占用多个扇区时,如FAT32和NTFS文件系统,只备份第一个扇区的数据。

程序运行以后,除了每个逻辑驱动器建立两个备份文件之外,还建立了一个扇区号的备查文件。目的是当系统引导出现故障时,可以将备份出来的数据,再按照原来的扇区号写回去,就可以修复硬盘。

扇区号备查文件的内容如下。

    Boot sector number:
    1:0
    2:63
    3:4192965
    4:4193028
    5:8385930
    6:8385993
    7:12578895
    8:12578958
    9:16771860
    10:16771923
    11:20964825
    12:20964888
    13:41447700
    14:41447763

根据扇区号备查文件中的记录,可以读出E盘存储分区链表的扇区号是“8385930”。再运行“查看硬盘扇区数据.EXE”程序,将“8385930”号扇区的数据显示在对话框中,程序的运行结果如图2-1所示。

图2-1

因为E盘不是第一个逻辑驱动器,所以在图2-1所示的对话框显示的数据中,没有主引导记录,只有分区链表。

找到字节位移1c6H开始的4字节,也就是字节编号455-458,扇区数据中的字节值是“3F 00 00 00”。这是一个双字,由于存储时的顺序是低字节在前,高字节在后,因此这个双字写成十六进制的形式是“0000003fH”,换算成十进制是“63”。

这个数值是分区前的扇区数,也可以看作是系统保留的扇区数。文件系统在检索文件的过程中,需要进行扇区号计算时,是从分区引导记录存储的扇区号开始的,系统保留扇区不计算在内。

在这63个系统保留扇区中,只有最前面的扇区写有数据,其余62个扇区空置不用。系统保留扇区之后,就是存储分区引导记录的扇区。用8385930加上63,就得到分区引导记录的扇区号是“8385993”。

运行“查看硬盘扇区数据.EXE”程序,将“8385993”号扇区的数据显示在对话框中,程序的运行结果如图2-2所示。

图2-2

在图2-2所示的对话框显示的数据中,与当前讨论的问题相关的是BPB表,其他的内容不在本书讨论的范围。

解读E盘BPB表的内容,可以参考第1章中的表1-2来进行。为了简化叙述的过程,在描述扇区中某一个字节的位置时,只使用字节编号,暂时就不再使用字节位移的概念了。

现在找到第23字节开始的两字节,存储在扇区中的数据是“00 01”,也就是“0100H”,十进制是“256”。这一个字段的值,记录的是每个FAT表占用的扇区数。

先读出第一FAT表的第一个扇区,因为FAT16文件系统的分区引导记录只占用1个扇区,而紧接在分区引导记录之后的就是FAT表,所以第一FAT表的首扇区号是“8385993”加上1,即“8385994”。

运行“查看硬盘扇区数据.EXE”程序,将“8385994”号扇区的数据显示在对话框中,程序的运行结果如图2-3所示。

图2-3

在第1章中曾经介绍过,FAT16文件系统和FAT32文件系统有一个共同的特点,它们的FAT表的首扇区的前两字节是F8 FF,图2-3所示的对话框显示的数据符合这个特征。

用第一FAT表的首扇区号加上每个FAT表占用的扇区数,就是第二FAT表的首扇区号。具体计算方法是8385994+256=8386250。

运行“查看硬盘扇区数据.EXE”程序,将“8386250”号扇区的数据显示在对话框中,程序的运行结果如图2-4所示。

图2-4

将图2-4所示的对话框显示的数据与图2-3所示数据比较一下,可以发现它们完全相同。因此当第一FAT表意外损坏时,可以将第二FAT表的数据拷贝到第一FAT表相对应的扇区中去,覆盖损坏的数据,就可以修复文件系统。

接下来继续计算文件目录表FDT的扇区地址。将第二FAT表的首扇区号,加上每个FAT表占用的扇区数,就是FDT的首扇区号,具体计算方法是8386250+256=8386506。

运行“查看硬盘扇区数据.EXE”程序,将“8386506”号扇区的数据显示在对话框中。可是FDT表的首扇区不象FAT表的首扇区那样,有一个“F8 FF”的判断标志,如何验证显示的就是首扇区呢?为了消除这个疑问,可以在显示了“8386506”号扇区的数据以后,再打开一个对话框,显示的是其前一个扇区,即“8386505”号扇区的数据。通过两个对话框数据的比较,就能验证这个问题,程序的运行结果如图2-5所示。

如图2-5所示,左边的对话框显示的是“8386505”号扇区的数据,右边的对话框显示的是“8386506”号扇区的数据。因为“8386505”号扇区属于第二FAT表的最后一个扇区,而一般情况下FAT表不会被写满,所以该扇区的数据为0。由此可以验证出,“8386506”号扇区确是FDT表的首扇区。

图2-5

如果将“8386506”号扇区的数据用字符方式显示出来,就能观察到存储在E盘的部分目录或文件名。在WINDOWS 2000的32位图形界面下,有些特殊字符不容易显示,使用辅助的16位程序,显示效果要好一些。打开WINDOWS 2000的“命令提示符”窗口,在命令行运行程序READSF.EXE,显示效果如图2-6所示。

图2-6

现在将图2-6的截图画面解释一下。执行程序时在命令行输入“readsf/rc”,readsf是可执行文件名,/rc是命令行开关,设定程序用字符方式显示文件内容。回车后程序显示提示行“Enter file name:”,输入需要显示数据的文件名“fdtfile”,该文件中备份的是“8386506”号扇区的数据,是由“查看硬盘扇区数据.EXE”程序建立的。

在显示的字符内容中,上面几行的第一个字符都是“σ”,这个ASCII字符的值是e5H,表示原来的文件已被删除。下面有几行显示出目前存储的目录或文件名,如在第11行显示的“NTCPP”就是一个目录名。

最后计算数据区DATA的首扇区地址。因为FAT16文件系统的FDT表占用固定的32个扇区,所以用FDT表的首扇区号加上32,就是数据区的首扇区号,计算结果是“8386538”。为了验证这种推导是否正确,仍然采用前面的方法,将其前一个扇区的数据并列显示在对话框中加以比较。程序的运行界面如图2-7所示。

图2-7

如图2-7所示,左边的对话框显示的是“8386537”号扇区的数据,右边的对话框显示的是“8386538”号扇区的数据。因为“8386537”号扇区属于FDT表的最后一个扇区,而一般情况下FDT表不会被写满,所以该扇区的数据为0。由此可以验证,“8386538”号扇区确实是数据区DATA的首扇区。

2.3 FAT32的扇区分配

FAT32文件系统可以认为是扩展了的FAT16文件系统,因为它的数据结构基本上与FAT16文件系统相同。如FAT表的结构是相同的,只不过簇登记项使用了32位的标识符;文件目录登记项的字段记录基本是一样的,只不过没有放在固定的FDT表中,而是存储在数据区中。这种扩充是计算机技术飞速发展的需要,其中最主要的原因是硬盘容量的快速增长。

FAT32文件系统的扇区分配与FAT16文件系统相比较,有一些地方不相同,主要表现在以下几个方面。

(1)FAT32文件系统使用32位簇标识符,但保留了高4位,实际上只有28位簇标识符,可以访问228个簇。而FAT16文件系统使用16位簇标识符,只能访问216个簇。

(2)由于每个簇占用的扇区数的减少,使得簇的数量大大增加,因此每个FAT表占用的扇区数也大大增加了。

(3)FAT32文件系统没有固定的FDT表,将文件和目录登记项都作为数据对待,与其他数据一样存储在数据区DATA中。

(4)分区引导记录占用6个扇区,并且有两个相同的拷贝,共占用12个扇区。FAT表之前的保留扇区数增加到32个。

FAT32文件系统的扇区分配如表2-2所示。

表2-2 FAT32文件系统的扇区分配

2.4 FAT32扇区寻址实例分析

现在以作者的1号硬盘中的H盘为例,说明对FAT32文件系统各部分扇区的寻址计算方法。

根据2.2节中的扇区号备查文件记录,可以读出H盘存储分区链表的扇区号。因为每一个逻辑驱动器备份两个扇区数据,所以与H盘对应的扇区应该是第11和第12个记录。第11个记录是分区链表扇区号,读出其值是“20964825”,第12个记录是分区引导记录的首扇区号。

运行“查看硬盘扇区数据.EXE”程序,将“20964825”号扇区的数据显示在对话框中,程序的运行结果如图2-8所示。

图2-8

因为H盘不是第一个逻辑驱动器,所以在图2-8所示对话框显示的数据中,没有主引导记录,只有分区链表。

找到字节位移1c6H开始的4字节,也就是字节编号455-458,扇区数据中的字节值是“3F 00 00 00”,换算成十进制是“63”。

这个数值是系统隐藏的扇区数,用20964825加上63,就得到分区引导记录的首扇区号是“20964888”。

运行“查看硬盘扇区数据.EXE”程序,将“20964888”号扇区的数据显示在对话框中,程序的运行结果如图2-9所示。

图2-9

FAT32文件系统的分区引导记录有两个相同的拷贝,每个拷贝占用6个扇区。所以将扇区号20964888加上6,就得到第二份拷贝的首扇区号是“20964894”。

运行“查看硬盘扇区数据.EXE”程序,将“20964894”号扇区的数据显示在对话框中,程序的运行结果如图2-10所示。

图2-10

将图2-9所示的对话框与图2-10所示的对话框的内容比较一下,可以发现它们完全一样。

现在计算第一FAT表的首扇区地址。前面曾讲过,FAT32文件系统的分区引导记录一共保留了32个扇区。所以用分区引导记录的首扇区号加上32,就得到第一FAT表的首扇区地址,计算方法是20964888+32=20964920。

运行“查看硬盘扇区数据.EXE”程序,将“20964920”号扇区的数据显示在对话框中,程序的运行结果如图2-11所示。

图2-11

在图2-11所示的对话框显示的数据中,前两个字节的值是“F8 FF”,这是FAT表的首扇区标志,不管是FAT16文件系统,还是FAT32文件系统,都具有这种扇区特征。

要继续计算第二FAT表的首扇区地址,首先必须根据某一个字段值计算出每个FAT表占用的扇区数。

参考第1章中表1-3的内容,知道在FAT32文件系统的BPB表中,每个FAT表占用的扇区数,记录在分区引导记录扇区中的第37-40的4字节中。

在图2-9或图2-10中,读出该字段的值是“0D 27 00 00”,十六进制是“270dH”,十进制是“9997”。于是就得到第二FAT表首扇区地址的计算方法是20964920+9997=20974917。

运行“查看硬盘扇区数据.EXE”程序,将“20974917”号扇区的数据显示在对话框中,程序的运行结果如图2-12所示。

图2-12

将图2-11所示的对话框与图2-12所示的对话框中显示的数据比较一下,可以发现它们完全相同。

因为FAT32文件系统没有FDT表,所以找到第二FAT表以后,最后查找的就是数据区DATA了。用第二FAT表的首扇区号,加上每个FAT表占用的扇区数,就得到数据区的首扇区地址。计算方法是20974917+9997=20984914。

运行“查看硬盘扇区数据.EXE”程序,将“20984914”号扇区的数据显示在对话框中。为了验证该扇区是DATA的首扇区,仍然采用以前的方法,将其前一个扇区的数据并列显示出来,进行比较判断。程序的运行结果如图2-13所示。

图2-13

如图2-13所示,左边对话框显示的是前一个扇区的数据,全部字节都是0,由此可以验证计算结果是正确的。

前面曾讲过,FAT32文件系统将文件目录登记项作为数据对待,也存储在数据区中,存储格式与FAT16基本相同。现在将图2-13右边对话框中的数据,用字符方式显示出来验证一下。为了使字符显示的效果好一些,可以运行16位程序 READSF.EXE,程序运行后的显示界面如图2-14所示。

图2-14