Board logo

标题: 转:DOS操作系统下的磁盘结构 [打印本页]

作者: yiyesong     时间: 2002-11-2 00:00    标题: 转:DOS操作系统下的磁盘结构

随着计算机的广泛应用,计算机的知识普及已成为应用和管理的重要组成部分。我国的个人电脑使用较为普遍的是DOS操作系统,当前席卷全球的计算机病毒所感染的也基本上是DOS操作系统的机器。因此对操作系统和磁盘使用有较全面的认识,将使计算机的应用和管理水平有所提高,同时为预防计算机病毒以及解毒提供了强有力的工具和途径。本文侧重概述DOS操作系统的引导过程、操作系统下磁盘的引导扇区、文件分配表(FAT)、目录表(FCB)、磁盘的格式化等。

一、操作系统的引导过程

当开机上电时,计算机的硬件系统就会产生一个复位脉冲,这个复位脉冲直接送到80X86芯片的管脚上,80X86芯片接到这个脉冲后,其硬件逻辑就会置CS寄存器为FFFFH,IP寄存器为0000H,也就是说,会自动地到FFFF:0000H去取第一条指令,转移到系统版上8KBROMBIOS程序。该程序首先运行加电自检模块,若自检正常,则转入INT19H调用,进行系统引导,若自检有错,则显示错误信息进入死循环。

在进行系统引导时,引导程序还要对外挂ROM进行扫描,若扫描到硬盘控制器中的ROM(起始地址为C800:0000H,其中放的是2KB硬盘设备驱动程序),则进行软中断的重新分配,把原INT13H给硬盘,软盘中断改为INT40H,然后进行操作系统的引导。

首先,引导程序试图将软盘驱动器A:上0头、0道、1扇区(BOOT)引导记录读到起始地址为0000:7C00H的内存单元中,若成功,则执行软盘上引导程序,引导操作系统;若不成功,则将硬盘的0头、0道、1扇区的硬盘主引导记录读到起始地址0000:7C00H的内存单元中,并执行该硬盘主引导程序,其作用是将当前活动分区的分区引导程序也读到上述内存单元中,以完成该分区操作系统的引导。

从上面的叙述不难看出,硬盘与软盘引导系统的最大差别在于,硬盘要执行其物理第一扇区中的主引导程序之后才能转入相应分区逻辑第一扇区中与软盘类似的分区引导程序。

二、磁盘的引导扇区

磁盘的扇区分配由两个部分组成,第一部分只有一个扇区,这就是0道(柱)、0头、1扇区,也就是整个磁盘的第一扇区(物理上),这就是磁盘的主引导扇区。第二部分是供各个操作系统使用的扇区。

(一)、软盘的主引导扇区

主引导扇区内容由FORMAT创建,引导记录可分为四部分:

1、3字节转移指令(供系统盘用);

2、8字节含厂商标志、操作系统版本号;

3、BIOS参数块(共19字节,亦称BPB参数表);

4、引导代码,包含了自举程序的实际代码,引导代码仅对操作系统盘有效;

当该盘作系统盘时,执行转移指令,转到引导代码,执行自举程序,将DOS装入内存。

下面主要介绍BIOS参数块,通过该参数块可获得文件分配表、主目录及数据区起始扇区号。从主引导扇区第12个字节内容开始,具体的含义如下:

1213字节:描述扇区大小(字节);

14字节:每簇所占扇区个数;

1516字节:保留扇区数;

17字节:FAT(文件分配表)个数;

1819字节:主目录(FCB)大小(文件个数);

2021字节:磁盘总扇区数;

22字节:介质描述符(FD双面双密度360KB软盘,F9双面高密度1.2MB软盘,F8硬盘);

2324字节:每个FAT表所占扇区数;

2526字节:每道扇区数;

2728字节:磁头个数;

2932字节:隐含扇区数;

3336字节:(只对硬盘有效)。当分区总数>FFFFH时,总扇区数填入此处,且2021处值为0(此时分区容量>32M)。

注:

(1)以上凡占2个字节的,前一字节是低位,第二字节是高位;

(2)所表示的数均是16进制数(各字节内容);

对软盘来说,主引导扇区是物理第一扇区,也是逻辑O(第1个)扇区,可用DEBUG的L、W命令进行读、写操作。

(二)、硬盘的引导扇区

1、硬盘的主引导扇区(隐含扇区)

该扇区主要由两个部分组成:主引导程序和分区信息表。分配如下表:

地址偏移硬盘0道(柱)、0头、1扇区

0000H―――主引导记录及一些数字0

01BEH―――第一分区表(16字节)

01CEH―――第二分区表(16字节)

01DEH―――第三分区表(16字节)

0IEEH―――第四分区表(16字节)

01FEH__55H

01FFH―――AAH

硬盘主引导扇区内容由FDISK.COM创建。整个硬盘空间最多划分为4个分区,可提供4个操作系统共享,每个操作系统占一个分区,如整个硬盘只提供一个操作系统使用,则其它三个分区的长度即所占扇区数为0。在IBMPC、长城系列及其兼容机上,可通过FDISK.COM来指定各分区的大小和起止的柱面号、扇区号等;分区信息表就是用来保存这些分区信息的。分区信息表由4项组成,每项占16个字节。每一分区信息的各字节内容如下述:

第1字节:为引导标志。如该字节内容为0,表示系统加电或复位自检时,不从这个分区引导操作系统。如果该字节值为80H,则表示系统加电冷启动或热启动时,从这个分区中引导操作系统。在系统冷、热启动时,引导过程会检查分区信息表所有4项中的这个引导标志。DOS的FDISK.COM命令可以置某分区中这个字节值为80H,而置其余分区的这个字节值为0。

第2字节:为本分区起始磁头号。

第3字节:为本分区起始的扇区号。在这个字节中只有低6位是表示扇区号,而高2位则表示起始柱面号的最高2位。

第4字节:为本分区起始的柱面号。

第5字节:为本分区操作系统代码。DOS3.0以下版本,该字节值为01,3.0以上版本该字节值为04,5.0以上版本为06等,当该字节值为
02、03时,则表示该分区的操作系统为XENIX。该字节值为63,表示该分区的操作系统为NIX。该字节值为65,表示该分区的
操作系统为NetWare。

第6字节:本分区结束的磁头号。

第7字节:本分区结束扇区号。其中高2位表示结束柱面号的高2位。

第8字节:本分区结束柱面号。

第912字节:在本分区之前已经使用掉的扇区数。

第1316字节:本分区所使用的扇区数。

硬盘的主引导程序在硬盘的第一扇区中,它是各操作系统的共同部分。它的作用就是查看分区信息表中的4个分区引导标志,当某一分区的引导标志为80H时,主引导程序就把这一分区的第一个扇区(逻辑0扇区)读到内存0000:7C00H处,并从那儿开始执行。主引导程序是属于隐含扇区的,只能用以下两种方法进行读写操作:

(1)、用中断13H实现,用下面的小程序段:

MOVDX,0080硬盘0磁头;

MOVCX,00010道第1扇区;

MOVBX,0200缓冲区地址200处作为起始;

MOVAX,0X01X=2表示读1个扇区,X=3表示写一个扇区;

INT13H磁盘I/O中断;

执行该段程序,就可对硬盘主引导扇区进行读、写操作。

(2)、系统启动后,通过修改内存中的硬盘驱动器参数表(BPB),将总扇区数改为原总扇区数加隐含扇区数,隐含扇区数改为0,则可用DEBUG.COM的L、W命令对主引导扇区进行读、写(事实上,经过上述改动后,主引导扇区已变为逻辑0扇区)操作。

2、分区引导扇区

DOS分区引导程序占据着该分区的第1扇区(逻辑0扇区),内容与软盘的主引导扇区基本相同,只不过BPB参数表的具体值不同。DOS分区引导程序不一定就在硬盘的物理第二扇区,需根据隐含扇区数定。这一扇区的逻辑号总是0。
分区引导程序由FORMAT创建。

三、FAT表、FCB和数据区起始扇区号计算方法及簇号和扇区号的关系

为以下叙述文件分配表(FAT)、目录表(FCB)的方便,将以下涉及的有关换算关系先在这里列出:

第一个FAT表总是从逻辑1扇区开始;

第二个FAT表起始扇区号=1+FAT表长;

主目录起始扇区号=1+2个FAT表长;

数据区起始扇区号=1+2个FAT表长+主目录长;

S=(C2)*(扇区数/每簇)+数据区起始扇区号,其中:S表示数据(文件)所在的逻缉扇区号,C表示数据(文件)所在的簇号。以上关系式中,起始扇区号均表示逻辑扇区号。

四、DOS对文件的空间分配

DOS进行格式化时对磁盘空间按如下分配:

(1)引导部分;

(2)文件分配表的第一拷贝;

(3)文件分配表的第二拷贝;

(4)根目录;

(5)数据区;

注:以上分配对软盘而言是整个盘空间,对硬盘而言是DOS分区部分。

文件的空间分配(在数据区中)仅当需要时才进行(不是预先分配)。每次分配一簇的空间(分配单位),一簇总是一个或多个连续的扇区。文件分配中,文件所有的簇是链在一起的,对多磁头介质(磁盘),调整盘簇使头的移动减到最少。在转到下道上去时,要分配完本道(柱)的全部空间。这个过程是这样进行的,先使用编号最低的顺序扇区,然后移到下一个头的扇区,按此法进行下去直到道的所有头的扇区使用完。再往下,就是下一道的0头1扇区。

数据区域里的文件无需按序写到盘上。每次分配一个簇的数据空间,跳过已分配的簇,找到的第一块空闲的簇便是下一个要分配的簇,不考虑其在硬盘空间上的物理位置。这样可高效率利用盘空间,因为删除文件后可用的簇又能分配给新的文件。

五、文件分配表FAT

DOS使用文件分配表将文件的簇转化为逻辑扇区号,然后,驱动程序就负责找出盘上逻辑扇区。FAT有两个,当采用拷贝、删除、创建、修改文件等操作时(用DOS命令),两个FAT表同时更新,相对应扇区内容一样。但当用调试命令DEBUG.COM的W命令针对扇区操作时,则只写指出的扇区,对另一FAT表相扇区内容不作更新(当用INT13H的AH=3功能调用写盘也是如此)。FAT的内容是文件所占用的簇号及结束标志。DOS3.0以后的版本里,FAT的每一表项有16位和12位两种,12位长的表项最多可表达4096簇,16位长的表项最多可表达65536簇,在DOS下,每簇扇区数是由FDISK.COM和FORMAT.COM命令确定的,且以后不能改变,除非再次运行上述两条命令。在DOS3.0以后版本里,对硬盘使用FDISK.COM命令建立分区时,究竟是使用12位还是16位FAT表项来表示簇号,取决于DOS分区是否大于4096簇,大于时,则建立的FAT每一表项为16位,否则为12位。FAT对文件的分配总是从第2簇开始。它的内容含意如下:

0000H(000H):簇未用或可用;

FFF8FFFFH(FF8FFFH):文件结束标志;

FFF7H(FF7H):如果不是分配链部分则表示坏簇;

XXXXH(XXXH):非上述的任何十六进制数,表示文件HEXTCLUSTER的簇号。
文件里第一个簇号保存在文件目录项里,它的取值范围0002FFEFH(002FEFH)。

注:四位16进制数对应的是16位表项的FAT,三位16进制数对应的是12位表项的FAT(下同);一般地,FFF0FFF6H(FF0FF6H)是用来表示备用簇。

由目录表项里可查到文件的起始族号,由此就可找出文件使用的其它簇号,方法是:

1、将目录表项里文件的起始簇号*2(或1.5);

2、乘积的整数部分是相对FAT的位移量,指出了映射到刚使用的簇的项。这个项含有文件的下一个簇的簇号。

3、对于12位表项的FAT,如果最后一次所用的簇号是偶数,保留低12位,否则保留高12位。

4、如果作为结果的值是FFF8FFFFH(FF8FFFH),文件中就不再有簇可用,否则含有下一簇的簇号。

注:以上算法中要注意16进制与10进制的转换,1中乘以2针对16位表项FAT,乘以1.5针对12位表项FAT。

六、文件目录表(FCB)

FORMAT.COM为所有盘建立根目录,它的位置(逻辑扇区号)和项的最大数,可通过BIOS参数块算出。除根目录外的目录实际上是文件,对它们所包含的项是没有限制的,子目录可做为文件来读,使用带有适当的属性字节的扩展FCB来完成。在文件目录表中,一个扇区只有16个文件(目录)项。

1、每一文件(目录)项的各位表示状态07字节是文件名。首字节00H表示从未用过,E5H表示用过已删除,2EH表示是目录项,其它表示文件名的第一个字符。

810字节是文件扩展名。

11字节是文件属性。01表示只读文件;02表示隐含文件,04表示系统文 件;08表示该目录项包含盘称号的头11个字节,除此之外,不再有其它有用 信息,并且只存在于根目录里(即表示的是磁盘卷标号);10表示该项定义一 个子目录;20表示留档位,文件一但写入或关闭,该位就置位;30表示归档加 子目录;32表示归档加子目录加隐含等等(这里的数01、02...30、32是十六进 制数)。

1221字节是备用。2223字节记录文件建立最后一次修改的时间(位映图 如下):

(HH)(MM)(XX)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

这里:

HH:是小时的二进制记数(023),占5位;

MM:是分钟的二进制记数(059),占6位;

XX:是以二秒为增量的二进制记数,占5位;

2425字节表示文件的最后一次修改日期,按位挥惩既缦?

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Y Y Y Y Y Y Y M M M M D D D D D

这里:

915位是YY(表示年),值是0119(19802099);

58位是MM(表示月).值是112;

04位是DD(表示日),值是131;

2627字节是文件(目录项)的起始簇号。

2831字节表示以字节计的文件大小。第一个字包含了大小的低位部分, 两个字的第一字节都是存贮其数字值的低位有效字节。

2、如何寻找子目录及其下的文件目录表

(1)在主目录中找出其子目录的起始簇号;

(2)由簇号与扇区号的转化公式求出逻辑扇区号;

(3)从该扇区开始可查找其子目录下各个文件的目录表项了;

如还想找该子目录下的子目录,再用上法依次进行下去。

注:查找文件的(数据)存贮扇区方法同上类似,但不要进行第3步,再由 起始簇号通过FAT查出所有的簇号,依次找出其存贮的逻辑扇区。

七、磁盘的格式化

磁盘的格式化分为低级格式化(初始化)和高级格式化(FORMAT)。

(一)、磁盘的低级格式化

磁盘的低级格式化是指对磁盘进行物理格式化。一般只在以下情况之 一出现时,才进行操作。

1、当磁盘的0道受到物理损坏(因移动机器前没有进行磁头复位的操作及硬盘磁头的读、写时断电,使磁头划伤磁盘等);

2、用户更换新的硬盘驱动器;

3、在硬盘上试图装入几种不同的操作系统。例如:原来硬盘上装有多用户操作系统XENIX和单用户操作系统DOS,这时还想装入另一种多用户操作系统;

4、在硬盘上出现无法在操作系统下恢复的错误。

对磁盘初始化可以通过以下三种办法进行:

1、借助ROMBIOS程序(针对硬盘)

在控制板上的硬盘ROMBIOS程序中提供了硬盘初始化程序。系统启动后,ROMBIOS为板上带ROM程序的适配器插件板提供了进入系统的方便条件。可由 下列两种形式实现:

(1)在DEBUG状态提示符下,用D命令显示地址C800:0000000FH之间的内容,确认为ROM:

C800:000055AAXX......其中XX表示ROM长度;

然后,用U命令把0003000F之间的目标代码反汇编(一般其中有23条JMP 指令),查出跳转到ROM中低级格式化程序段去的JMP指令所在存贮单元的首 地址偏移量XXXX,运行命令G。不同的硬盘机器,G命令起始地址的偏移量XXXX可能稍有不同,但一般来说,第二条JMP指令所在单元的首地址偏移量即为XXXX。(如PC/XT及东海0520机)

(2)用以下程序段实现:

MOVAX,07XXAH=07表示驱动器格式化(初始化),用XX扇区内容替代所有扇区;

MOVDX,0080硬盘0磁头;

MOVCX,00010道1扇区开始;

INT13H

INT3H

注:以上所述2种方法在PC/XT及其兼容机长城0520、东海0520上已实现;

2、运行系统盘上(若有)的LOWFORM.EXE低级格式化程序和带低级格式化功能的工具软件;

3、运行随机提供的诊断程序(硬软盘均行);

(二)、磁盘的高级格式化(FORMAT)

当对软盘FORMAT时,将创建主引导扇区,FAT表除前3个字节为FD、FF、FF(双面双密度360KB)外,其它字节置0;对目录表FCB,3.0以上版本将其所有字节全置0,3.0以下版本将第一字节置0,其它字节置F6,数据区所有字节都置F6。

当对硬盘FORMAT时,做以下几项工作:

1、根据建立DOS分区命令FDISK.COM记录在硬盘上的信息,对属于DOS分区部分数据区只进行检测,若有损坏扇区,在FAT表对应的串(簇号)置FFF7H(FF7H),其它的数据一律保留不动;

2、初始化DOS的文件分配表和文件根目录区,将FAT表内容置0,FCB表目录项的第一字节置0。初始化磁盘结构参数表。

3、创建DOS分区引导程序,记录在分区的第一扇区(逻辑0扇区);

若需在硬盘启动机器(加/S参数),则还要建立IBMBIO.COM、IBMDOS.COM(长城系列机为GWBIO.COM、GWDOS.COM;MSDOS为IO.SYS和MSDOS.SYS)、COMMAND.COM三个文件。

(三)、对磁盘的磁道进行格式化

对磁道进行格式化是由ROMBIOS提供的13号中断的5号功能完成的。其调用格式如下:

入口:AH=5DH=磁头号DL=盘号CH=磁道号

ES:BX缓冲区必须指向所需地址区段集合,每个区段包含四个字节(C、H、R、N),其中:C=磁道号,H=磁头号,R=扇区号,N=每扇区字节数,以03分 别表示每扇区128、256、512、1024字节。

根据以上入口参数,调用13号中断就可对磁盘某一道进行格式化。

例如:可对360KB软盘进行40道、41道的格式化,增加18KB容量,可由以下程序实现:

ES:0100MOVAX,0501AH=5,表示对磁道进行格式化;

ES:0103MOVBX,02X0X=0,3,6,9使得ES:BX

指向对应头、道的内存缓冲区扇区数据识别的地址;

ES:0106MOVDX,0X0XDH=00、01表示0磁头、1磁头,DL=00、01表示A盘、B盘;

ES:0109MOVCX,2X01X=8表示40道,X=9表示41道

ES:010CINT13H 扇区识别数据如下:

C H R

ES:0200 28 00 01 02 28 00 02 02 28 00 03 02 28 00 04 02

ES:0210 28 00 05 02 28 00 06 02 28 00 07 02 28 00 08 02

ES:0220 28 00 09 02 00 00 00 00 00 00 00 00 00 00 00 00

ES:0230 28 01 01 02 28 01 02 02 28 01 03 02 28 01 04 02

ES:0240 28 01 05 02 28 01 06 02 28 01 07 02 28 01 08 02

ES:0250 28 01 09 02 00 00 00 00 00 00 00 00 00 00 00 00

ES:0260 29 00 01 02 29 00 02 02 29 00 03 02 29 00 04 02

ES:0270 29 00 05 02 29 00 06 02 29 00 07 02 29 00 08 02

ES:0280 29 00 09 02 00 00 00 00 00 00 00 00 00 00 00 00

ES:0290 29 01 01 02 29 01 02 02 29 01 03 02 29 01 04 02

ES:02A0 29 01 05 02 29 01 06 02 29 01 07 02 29 01 08 02

ES:0280 29 01 09 02 00 00 00 00 00 00 00 00 00 00 00 00

此时驱动器的电参数表内容为:

0000:0522DF02250209......(该处地址,不同的机器可能有差别)

对于上述,取BX=0200,DX=0001,CX=2801,则对B盘0头(面),40道进行格式化(9扇区/每道),依次修改BX、DX、CX的取值,执行0100010E之间的程序段就完成了对40道、41道的格式化。然后修改磁盘的BPB参数中软盘的总扇区数,将02D0H改为02F4H,则软盘的容量为387072字节(378KB比原来增加18KB),且DOS(3.0以上版本)可对40道、41道进行正常管理。

对以上分析可知,我们既可以增加软盘的容量,又可以将某些重要信息写入40道、41道中的扇区(用DEBUG的W命令),再将BPB参数表中总扇区数改为02DOH,达到特殊的加密效果,阻止它人读、写及复制。此时在360KB驱动器执行FORMAT也不会破坏40道、41道内容。同时只要对以上程序、驱动器电参数表(格式化参数)、扇区识别数据稍加修改还能格式化出每道多于或少于9个扇区的特殊化磁道(大多数游戏盘就是采取这种机理制作的)。如取电参数表中的N=00,扇区个数为20H,对其它的参数也略加修改,将扇区识别数据内容
相应改动为识别20H扇区、N=00,则可对某道实行每扇区128个字节、32个扇区的格式化,这样的磁道也阻止正常的DOS读、写及复制,在磁道的扇区保存一些重要信息(需要单独编制读、写程序),同样可以达到特殊的加密效果。

本文从操作系统的引导过程、引导扇区、DOS对文件的空间分配、文件和目录分配表的意义及起始扇区的计算方法、磁盘的格式化等方面对磁盘的使用作了浅析,愿广大计算机爱好者通过该文的介绍,能对磁盘的使用有一个较深的认识。
作者: kickout     时间: 2002-11-2 00:00
好啊,从哪搞来的?要收藏起来。呵呵。。。
有FAT32和NTFS的介绍吗?
作者: laochang409     时间: 2004-6-23 00:00
长见识!
作者: qinqong     时间: 2004-6-24 00:00