DOS是怎样管理硬盘的?

Author: 金西 Date: 1996-03-22

        一、DOS引导记录
        由FORMAT高级格式化写到逻辑0扇区(DOS引导扇区,又称BOOT区)的DOS引导记录由五个部分组成:
        (1)一条跳转指令
        (2)厂商标识代码
        (3)BPB参数信息
        (4)DOS引导程序
        (5)结束标志字
        DOS引导记录的主要功能是完成DOS系统的自举。第一部分占3个字节,如果该磁盘是DOS系统盘,引导它使PC将引导区中的数据装入内存并执行此跳转指令,它跳过厂商标志和BIOS参数块区,直接到引导代码。第二部分占8个字节,包含厂商标志。此域DOS并不需要使用,但可利用一些工具软件看到这部分数据,第三部分BPB参数信息是一组很重要的参数,占19字节,其中长度为13个字节的BIOS参数块(BIOS Parameter Block简称BPB)记录了磁道的重要信息,如每扇区字节数,磁盘介质说明符等。紧接着BPB的3个字(占6个字节)说明每道扇区数、磁头数、隐存扇区数,提供给磁盘驱动程序,对磁盘起补充说明作用,通常把它们与BPB参数块合在一起,称为磁盘的BPB参数信息。BPB每张盘上都有,其中地址7C03-7C10的11个子项为BPB参数块。
        下面列出DOS 3.3下某硬盘的BPB参数块各子项的含义供参考:
        C:>debug
        -L 100 2 0 1
        -d 100
        ××××0100 EB34 90 49 42 4D 20 20-33 2E 32 00 02 04 01 00
        ××××0110 02 00 02 07 A3 F8 29 00-11 00 04 00 11 00 00 00
        其中:010B~010C为子项二,其代码为0200=512,即每一扇区有512字节;
        010D为子项二,其代码04,即每簇四个扇区;
        010E~010F为子项三,其代码为0001,即保留扇区数(主引导记录区)为一;
        0110为子项四,其代码为02,即有两个FAT表;
        0111~0112为子项五,其代码为0200,有512个根目录项;
        0113~0114为子项六,其代码为A307=41745个扇区;
        0115为子项七,其代码为F8,是硬盘;
        0116~0117为子项八,其代码为0029=41,一个FAT占用41个扇区;
        0118~0119为子项九,其代码为0011=17,每道有17个扇区;
        011A~011B为子项十,其代码为004,有四个磁头;
        011C~011D为子项十一,其代码为0011=17,隐含扇区数为17,其中第一扇区是主引导记录所在的扇区。
        第四部分DOS引导程序即BOOT代码占480字节,负责自动完成三个系统文件(IO.SYS,MSDOS.SYS及COMMAND.COM的装入。第五部分结束标志字占2个字节,其值为AA55,存储时也是低位在前高位在后。这样五个部分共占用512个字节,也正是一个扇区,因此称它为DOS引导扇区或BOOT区。不管该磁盘是否包含有DOS系统文件,在保留引导区中总是存在有自举代码,但只有此盘作为系统盘时它才能启动计算机。
        二、文件分配表(FAT)
        文件分配表用于存储磁盘文件空间用法的信息。此表包含所有未分配的、已分配的或标记为坏的盘簇的信息。盘簇是DOS进行磁盘空间分配的最小单位,一个簇可以是2个扇区,也可以是4个扇区或更多,视DOS版本及硬盘分区的大小而不同。虽然FAT记录你的文件所用的磁盘空间的信息,但引导区,两个FAT表,文件目录区等本身并不由FAT中的盘簇表示。
        FAT中每个磁盘上的可用盘簇就只有一个登记项。这些登记项表示该盘簇是在使用、空闲还是坏的。坏的盘簇是在格式化过程中通过FORMAT程序发现的。每个盘簇中只要有一个扇区有问题就整个不能使用,这样会浪费掉一些扇区。
        文件分配表FAT是文件管理系统用来给每个文件分配盘区空间的表格,该表格在磁盘上有两个相同的文本。文件分配表的表头占3个字节,其中第一个字节是磁盘介质说明符,在第2、3字节总是FFFFH,这是系统设定的,其内容含义如下:
        磁盘介质说明符 含义
        FF   双面   每道8扇区的软盘
        FE   单面   每道8扇区的软盘
        FD   双面   每道9扇区的软盘
        FC   单面   每道9扇区的软盘
        F8   硬盘
        DOS是以簇为单位给文件分配磁盘空间的,每个簇在FAT表中占一个表项,簇编号即为表项号。FAT在磁盘上每一簇由一个12位(1.5字节)项或由一个16位项(2字节)组成,对所有小于20740个扇区(10MB)的软盘或硬盘DOS分区用12位映象一个簇,如多于20740个扇区,则采用16位FAT。其中,0号表项和1号表项是表头。从2号表项开始,每一个表项作为一个簇的标志信息,占两个字节。其内容含义如下:
        表项内容 含义
        0000H      对应簇号为自由簇,可以使用
        FFF7H      对应的簇为坏簇,不可使用
        FFFFH      文件的簇链结束
        FFF0-FFFH  保留
        其它内容   文件的后续簇号
        系统隐含文件IO.SYS所在的首簇号总是0002。FAT对每个文件来说其数据结构是一个单向链表,文件在文件目录表FDT中占一个文件目录项,每个文件的首簇号存放在该文件的目录项中,一个文件目录项占32个字节,其中第26和27字节就是存放该文件的首簇号,系统依据FAT中的首簇号乘以2得到该文件在FAT表头的偏移地址,并得到第2簇的簇号,由此该文件的单链表即可找到它的全部内容。
        文件分配表总是放在DOS引导记录之后,若FAT大于一个扇区,则占用紧挨着的扇区,两个FAT拷贝连在一起存放,一个挨一个,连成整体。需要使用FAT时,将其读到DOS的一个缓冲区中。系统的文件分配表存放在逻辑1扇区开始的若干个扇区内,一个文件分配表占多少个扇区依硬盘分区情况的不同而不同。
        三、文件目录表
        FORMAT命令一开始就为整个磁盘建立根目录,每个DOS盘卷只有一个根目录,如果给盘卷起了卷标名的话,可把卷标看成是根目录名。因为每个DOS盘卷都与一个驱动器符相连接,故DOS简单地用“[驱动器符号:]\”表示在根目录下。根目录的作用是分配文件空间(逻辑扇区号),并且通过设备驱动程序接口确定有效的最大目录项。
        根目录区的文件目录表FDT中包括IO.SYS、DOS.SYS等文件的目录项,每个目录项占32个字节。由于除根目录外的所有目录实际上是文件,所以其包含的项数是没有限制的。磁盘上每个文件都有一个32字节长的目录项,它登记了文件的名字、属性、建立或最后修改的日期、时间以及文件在磁盘上存放的起始位置。除了卷标名可能占据该区的一个32字节外,该区的每个32字节都可以是根目录下的一个目录项 。注意区分目录项和目录这两个名词。目录项是一个32字节长的数据块,它登记着一个文件或子目录。目录是由若干目录项组成的一个表,根目录区是盘卷的一个固定区域,子目录项表是一个表文件。FDT的目录项内容及含义如下表所示:
        字节位置 内容及含义
        第0-7字节 表示文件名
        第8-10字节 表示文件的扩展名
        第11字节 表示文件属性其中值为00H(读写),01H(只读),02H(隐存),04H(系统),08H(卷标),10H(子目录),20H(归档)
        第12-21字节 保留未用
        第22-23字节 文件建立或修改时间
        第24-25字节 文件建立或修改日期
        第26-27字节 表示文件的起始簇号(首簇号)
        第28-31字节 表示文件的字节数(长度)
        当现行目录为子目录时,使用DOS命令DIR列文件目录,通常可以看到前两项特殊文件,单个英文句号(.)表示子目录;而(..)则表示上一级目录。子目录项中的文件长度总为零,尽管它的文件长度实际不为零,它的意义在于,不能使用普通文件读/写一个子目录文件。
        只有当文件需要时系统才给文件分配数据区空间。空间是按每次一个簇的方式来分配的(簇是最小单位),分配时可以跳过已分配的簇,第一个遇到的空簇就是下一个将要分配的簇,并不考虑簇在磁盘上的物理位置,这样使得磁盘空间得到有效的利用,同时删除文件后剩下的簇可以分配给新的文件,可以说数据区空间的使用是在文件分配表和文件目录表统一控制下完成的。一个簇总是由一个或多个连续的扇区组成的,每个文件所有的簇在文件分配表中都是链接在一起的。
        许多病毒是从修改引导记录和占用文件分配区及文件目录区进入计算机内的,一旦FDT区及FAT区被坏,则会造成系统崩溃。所以,做好引导记录及FAT、FDT信息的备份工作是很重要的。目前,一些防病毒软件如KV100和一些工具软件如Norton实用程序就可对上述数据进行备份。