硬盘主引导扇区MBRDPTDBRBPB详解.docx

上传人:b****7 文档编号:9767320 上传时间:2023-02-06 格式:DOCX 页数:21 大小:25.45KB
下载 相关 举报
硬盘主引导扇区MBRDPTDBRBPB详解.docx_第1页
第1页 / 共21页
硬盘主引导扇区MBRDPTDBRBPB详解.docx_第2页
第2页 / 共21页
硬盘主引导扇区MBRDPTDBRBPB详解.docx_第3页
第3页 / 共21页
硬盘主引导扇区MBRDPTDBRBPB详解.docx_第4页
第4页 / 共21页
硬盘主引导扇区MBRDPTDBRBPB详解.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

硬盘主引导扇区MBRDPTDBRBPB详解.docx

《硬盘主引导扇区MBRDPTDBRBPB详解.docx》由会员分享,可在线阅读,更多相关《硬盘主引导扇区MBRDPTDBRBPB详解.docx(21页珍藏版)》请在冰豆网上搜索。

硬盘主引导扇区MBRDPTDBRBPB详解.docx

硬盘主引导扇区MBRDPTDBRBPB详解

硬盘主引导扇区(MBR、DPT、DBR、BPB)详解.txt“恋”是个很强悍的字。

它的上半部取自“变态”的“变”,下半部取自“变态”的“态”。

硬盘主引导扇区(MBR、DPT、DBR、BPB)详解

 

引用:

网上收集的资料,放到这里来学习,这方面登山人大哥是高手,有空指点一下喽

硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。

MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。

但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(图一)。

  MBR由三部分构成:

  1.主引导程序代码,占446字节

  2.硬盘分区表DPT,占64字节

  3.主引导扇区结束标志AA55H

 一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。

启动PC机时,系统首先对硬件设备进行测试,成功后进入自举程序INT19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:

7C00首地址开始的区域,并执行MBR程序段。

  主引导代码实现下列功能:

  1.扫描分区表查找活动分区;

  2.寻找活动分区的起始扇区;

  3.将活动分区的引导扇区读到内存;

  4.执行引导扇区的运行代码。

  如果主引导代码未完成这些功能,系统显示下列错误信息:

  Invalidpartitiontable

  Errorloadingoperatingsystem

  Missingoperatingsystem

二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(图二);

硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。

在这里我们可以看出,硬盘的总分区数为什么不能大于4。

其中可激活分区数不得大于3,扩展分区数不得大于1,当前活动分区数必须小于等于1。

  分区表的每一分区的第0个字节是自举标志,其值为80H时,表示该分区是当前活动分区,可引导,其值为00H时,表示该分区不可引导。

  第4字节是分区类型(图三)。

  每一分区的第1至第3字节是该分区起始地址。

其中第1字节为起始磁头号(面号);第2字节的低6位为起始扇区号,高2位则为起始柱面号的高2位;第3字节为起始柱面号的低8位。

因此,分区的起始柱面号是用10位二进制数表示的,最大值为2^10=1024,因逻辑柱面号从0开始计,故柱面号的显示最大值为1023。

同理,用6位二进制数表示的扇区号不会超过2^6-1=63;用8位二进制数表示的磁头号不会超过2^8-1=255。

每一分区的第5至第7字节表示分区的终止地址,各字节的释义与第1至第3字节相同。

这里我们假设一种极端的情况:

如果让第5至第7字节的所有二进制位都取1,就获得了柱面号、磁头号和扇区号所能表示的最大值,从而得到最大绝对扇区号为:

  1024×256×63=16,515,072

  这个扇区之前的所有物理扇区所包含的字节数为:

  16,515,072×512Bytes≈8.46×109Bytes=8.46GB。

  由此可知硬盘的容量设计为什么会有8.4GB这一档,分区表每一分区的第1至第3字节以及第5至第7字节的数据结构已经不能满足大于8.46GB的大容量硬盘的需要。

考虑到向下兼容的需要,业界并未对从DOS时代就如此定义的硬盘分区表提出更改意见,否则改动所牵涉的面太广,会造成硬件和软件发展上的一个断层,几乎无法被业界和用户所接受。

硬盘厂商解决这一问题的方法是定义了新的INT13服务扩展标准。

新的INT13服务扩展标准不再使用操作系统的寄存器传递硬盘的寻址参数,而使用存储在操作系统内存里的地址包。

地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA接口,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接口。

通过这种方式,能实现在ATA总线基础上CHS寻址的最大容量是136.9GB,而LBA寻址的最大容量是137.4GB。

新的硬盘传输规范ATA133规范又把28位可用的寄存器空间提高到48位,从而支持更大的硬盘。

分区表每一分区的第8至第11字节表示该分区的起始相对扇区数(即该扇区之前的绝对扇区个数),高位在右,低位在左;第12至第15字节表示该分区实际占用的扇区数,也是高位在右,低位在左;分区表这类数据结构的表达方式与机器中数据的实际存储方式在顺序上是一致的,即低位在前,高位在后。

因此,在从16进制向十进制作数值转换时,需将字段中的16进制数以字节为单位翻转调位,用4个字节可以表示最大2^32个扇区,即2TB=2048GB。

  系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。

在未超过8.4GB的分区上,C/H/S的表示方法和扇区数的表示方法所表示的分区大小是一致的。

超过8.4GB的/H/S/C一般填充为FEH/FFH/FFH,即C/H/S所能表示的最大值;有时候也会用柱面对1024的模来填充。

不过这几个字节是什么其实都无关紧要了。

  扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录(ExtendedBootRecord,EBR)(图四)。

  扩展引导记录包括一个扩展分区表和扇区结束标志55AA。

一个逻辑驱动器中的引导扇区一般位于相对扇区32或63。

如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。

第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区;第二项指向下一个逻辑驱动器的EBR,如果不存在进一步的逻辑驱动器,第二项就不会使用,而被记录成一系列零。

如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区,第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。

扩展分区表的第三项和第四项永远都不会被使用。

  扩展分区表项中的相对扇区数是从扩展分区开始的扇区到该逻辑驱动器中第一个扇区的扇区数;占用的扇区数是指组成该逻辑驱动器的扇区数目。

有时候在磁盘的末尾会有剩余空间,由于分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。

三、主引导扇区的最后两个字节(偏移1FEH和偏移1FFH),其值为AA55H,它表示该扇区是个有效的引导扇区,可用来引导硬磁盘系统。

分区引导扇区DBR(DOSBOOTRECORD)是由FORMAT高级格式化命令写到该扇区的内容;DBR是由硬盘的MBR装载的程序段。

DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。

每个分区都有引导扇区,但只有被设为活动分区的DBR才会被MBR装入内存运行。

DBR主要由下列几个部分组成:

  1.跳转指令,占用3个字节的跳转指令将跳转至引导代码。

  2.厂商标识和DOS版本号,该部分总共占用8个字节。

  3.BPB(BIOSParameterBlock,BIOS参数块)。

  4.操作系统引导程序。

  5.结束标志字,结束标志占用2个字节,其值为AA55

  DBR中的内容除了第5部分结束标志字固定不变之外,其余4个部分都是不确定的,其内容将随格式化所用的操作系统版本及硬盘的逻辑盘参数的变化而变化。

  一、FAT32的分区引导扇区

  为了使加载文件的操作更加灵活,加上FAT32文件系统采用"活动"的FDT表,,同时考虑到引导程序的代码量和为今后发展保留适当的余量,FAT32文件系统分区引导扇区占据了6个扇区,只有前3个扇区作为系统的分区引导扇区,其余3个扇区保留暂未使用。

分区引导扇区对于操作系统的启动和磁盘文件的访问具有至关重要的作用;引导程序代码的损坏将导致操作系统不能正常启动,磁盘读写参数的破坏将造成存储在磁盘上的文件不能正常读写。

  由于分区引导扇区的重要性,FAT32文件系统在在第一个分区引导扇区的6个扇区后的6个扇区里保留了分区引导扇区的备份,在启动时操作系统可以对两份引导扇区进行比较,以便选择正确的引导扇区来引导系统。

由于在磁盘正常工作过程中系统不再对引导扇区的程序和数据进行修改,因此备份的分区引导扇区损坏的可能性非常小。

分区引导扇区的第一个扇区(图六)

的前三个字节是一条跳转指令,然后是8个字节长的OEMID(厂家标识)和版本号,其后是简称为BPB的BIOS参数块(BIOSParameterBlock)。

对于FAT32其各部分的意义如下表:

偏移地址

长度(字节)

意    义

0BH

2

每个扇区的字节数,常取512。

0DH

1

每簇扇区数;可以是1,2,4,8,16,32,64,128,取决于文件系统格式及分区大小。

0EH

2

为操作系统保留的扇区数;FAT32时多为十进制的32,FAT16时为1,有的格式化工具可能将它设为36或63。

10H

1

FAT表的个数;常取2。

11H

2

在FAT16中存放系统根目录中允许登记的目录项个数,FAT32中用于标注系统采用的是否为FAT32文件系统。

其值为0000H表示磁盘使用FAT32文件系统。

13H

2

值为00H,为保持兼容性而保留,未使用。

15H

1

磁盘介质标志,硬盘为F8。

16H

2

未使用,值为00H。

18H

2

每个磁道的扇区数。

1AH

2

磁盘的磁头数。

1CH

4

分区前隐藏扇区的个数。

20H

4

逻辑磁盘中的扇区总数。

24H

4

每个FAT表所占的扇区数。

28H

2

FAT表镜像标志,值为0表示系统保存2份互为备份的FAT表,值为1表示系统仅保存1份FAT表。

2AH

2

文件系统的主次版本(保留)。

2CH

4

磁盘根目录的起始簇号。

30H

2

文件系统参数的扇区号,通常位于引导扇区的下一个扇区。

32H

2

备份分区引导扇区的逻辑扇区号。

34H

12

保留,未使用。

40H

1

中断13呼叫的预设值,指明访问的设备;软盘为00H,硬盘为80H。

41H

1

用于中断13呼叫。

42H

1

磁盘读写参数扩展标志,其值为29H。

43H

4

格式化时随机产生的磁盘卷的序列号。

47H

11

格式化时人工输入的磁盘卷标号。

52H

8

文件系统的标识号(FAT32)。

  从偏移0x5A开始的数据为操作系统引导代码。

这是由偏移0x00开始的跳转指令所指向的,此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。

  扇区的最后两个字节存储值为0x55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。

分区引导扇区的第2个扇区作为文件系统相关参数存储标识扇区(图七),

除了保存扇区的标识信息(RraA(00H)和rrAa(1E4H))外,还可能在偏移地址1E8H处存储了文件系统有关的信息。

其中扇区偏移地址1E8H~1EBH的4个字节存储了逻辑磁盘中未使用的簇数,通常用于快速计算逻辑磁盘的剩余空间(典型的操作是在资源管理器状态栏上列出的"可用磁盘空间"参数),而1ECH~1EFH4个字节给出了逻辑盘中下一个可以分配给文件使用的空闲簇的簇号,这样操作系统可以不访问FAT表就直接获得磁盘剩余空间和可以分配的簇号。

  分区引导扇区的第3个扇区则存储了引导扇区的后一部分引导系统的程序代码(图八)。

二、NTFS的分区引导扇区

  对于NTFS分区来说,分区引导扇区DBR只占用一个扇区(图五),并且在该分区的最后一个扇区做了备份;NTFS的引导扇区也是完成引导和定义分区参数,NTFS分区的引导扇区不是分区的充分条件,它要求必须MFT中的系统记录如$MFT等正常该分区才能正常访问。

其BPB参数如下表所示:

偏移地址

长度(字节)

常用值

意  义

0x0B

2

0x0002

每扇区字节数

0x0D

1

0x08

每簇扇区数

0x0E

2

0x0000

保留扇区

0x10

3

0x000000

总为0

0x13

2

0x0000

NTFS未使用,为0

0x15

1

0xF8

介质描述

0x16

2

0x0000

总为0

0x18

2

0x3F00

每磁道扇区数

0x1A

2

0xFF00

磁头数

0x1C

4

0x3F000000

隐藏扇区数

0x20

4

0x00000000

NTFS未使用,为0

0x28

8

0x4AF57F0000000000

扇区总数

0x30

8

0x0400000000000000

$MFT的逻辑簇号

0x38

8

0x54FF070000000000

$MFTMirr的逻辑簇号

0x40

4

0xF6000000

每MFT记录簇数

0x44

4

0x01000000

每索引簇数

0x48

8

0x14A51B74C91B741C

卷标

0x50

4

0x00000000

检验和

 

[本帖最后由伐木者于2007-6-1920:

11编辑]

附件:

您所在的用户组无法下载或查看附件本文来自:

创幻论坛

UID55456帖子9783精华45积分47222威望0金币0阅读权限18性别男来自有树砍的地方在线时间8494小时注册时间2004-5-16最后登录2010-4-5查看详细资料

TOP

【推荐】权威专家推荐涨停股票请点击获取

伐木者

魏武王常所用论坛

 

超级版主

 

电脑家园区总版主

积分47222威望0注册时间2004-5-16

发短消息加为好友沙发大中小发表于2007-6-1720:

55只看该作者

HowItWorks---MasterBootRecord(主启动记录)

 

本文是介绍MBR的反编译程序的。

MBR是放在硬盘的0柱面,0磁头(head),1扇区的

那一段区。

MBR是由FDISK程序创建的。

所有操作系统的FDISK程序都会创建类似的MBR

记录。

MBR是多个分区的前提,每个MBR中包括了四个分区表记录。

在您的计算机加电

之后,INT19被调用了。

一般来说,INT19先从第一个软盘驱动器中读启动扇区记录。

如果在软盘中找到了启动的扇区,那么这个扇区的数据就被读入到内存的0000:

7c00

地址上,INT19也跳到了这个地址上。

但是,如果没有在软盘中找到这个扇区的话,INT

19就从第一个硬盘中去读。

同样,如果成功的话,也会把MBR导入到相同的内存地址

0000:

7c00,INT19也会跳这个地址。

MBR中包括的一段小程序是定出在分区表中的活动分

区。

这样的活动分区找到之,那个分区的启动扇区也被读入到0000:

7c00地址,MBR程序

也转移到了这个地址。

每一个操作系统都有固定的启动扇区的格式。

在启动扇区里的程

序要能定出操作系统启动程序的位置(或是核心本身,或者是一个启动管理器),然后

将它读入内存。

另:

在Ctrl-Alt-Del键被按下时,INT19也会被调用。

在大多数系统中,Ctrl-Alt-Del三?

nbsp;

键同时按下表示热启动您的计算机,回到INT19调用前的状态。

=====

数据存放的位置:

MBR程序放在偏移为0000的位置。

MBR消息放在偏移为008b的位置。

分区表放在偏移为00be的位置。

签名放在偏移为00fe的位置。

关于谁干什么事的总结:

如果一个活动分区找到了,这个分区的启动数据被读入到0000:

7c00的位置,MBR程

序也跳到0000:

7c00的位置。

这段程序找到指向分区表的入口,入口描述的是这段分区是

怎样被启动的。

启动程序用这些数据来决定用来启动的驱动器和这个驱动器分区在硬盘上

的位置。

如果没有找到这样的活动分区入口,ROMBASIC会转入INT18的调用。

所有其他的错

误导致系统的挂起,可以看HANG的标记。

注意(非常之重要):

  1)活动分区入口的第一个字节的内容是80h。

在INT13被调用之前,这个字节被导

入到DL寄存器中。

当INT13被调用时,DL表示的是BIOS的设备号码。

因为这个原因,由MBR

程序读的启动扇区只能从BIOS设备号码为80的硬盘中读入。

这便是为什么不能从任何硬盘

启动的原因。

?

nbsp;

  

  2)MBR程序是用基于INT13h(ah=02h)的中断的CHS来读取活动分区的启动扇区位置

的。

活动分区的启动扇区内的位置是在分区表内用CHS格式表明的。

如果这个驱动器小于

528M,这个CHS一定要是(L-CHS,见BIOSTYPES文档)。

在LBA中没有任何地址是有用的。

(另一个LBA不能解决>528M问题的原因)这点大家别信,西西。

 

====

这是一张整个MBR记录的表(hex和ascii格式)

OFFSET0123456789ABCDEF*0123456789ABCDEF*

000000fa33c08ed0bc007c8bf45007501ffbfc*.3.....|..P.P...*

000010bf0006b90001f2a5ea1d060000bebe07*................*

000020b304803c80740e803c00751c83c610fe*...<.t..<.u.....*

000030cb75efcd188b148b4c028bee83c610fe*.u......L.......*

000040cb741a803c0074f4be8b06ac3c00740b*.t..<.t.....<.t.*

00005056bb0700b40ecd105eebf0ebfebf0500*V.......^.......*

000060bb007cb8010257cd135f730c33c0cd13*..|...W.._s.3...*

0000704f75edbea306ebd3bec206bffe7d813d*Ou...........}.=*

00008055aa75c78bf5ea007c0000496e76616c*U.u.....|..Inval*

000090696420706172746974696f6e20746162*idpartitiontab*

0000a06c65004572726f72206c6f6164696e67*le.Errorloading*

0000b0206f7065726174696e67207379737465*operatingsyste*

0000c06d004d697373696e67206f7065726174*m.Missingoperat*

0000d0696e672073797374656d000000000000*ingsystem......*

0000e000000000000000000000000000000000*................*

0000f0TO0001afSAMEASABOVE

0001b000000000000000000000000000008001*................*

0001c00100060dfef83e00000006780d000000*......>....x....*

0001d000000000000000000000000000000000*................*

0001e000000000000000000000000000000000*................*

0001f0000000000000000000000000000055aa*..............U.*

====

这是MBR的反编译程序:

这个扇区被导入到内存的0000:

7c00位置,但是它又马上将自己重定位到0000:

0060的

位?

nbsp;

BEGIN:

#NOWAT0000:

7C00,RELOCATE

0000:

7C00FACLI#禁止中断

0000:

7C0133C0XORAX,AX#设置堆栈段地址为0000

0000:

7C038ED0MOVSS,AX

0000:

7C05BC007CMOVSP,7C00#设置堆栈指针为7c00

0000:

7C088BF4MOVSI,SP#SI=7c00

0000:

7C0A50PUSHAX

0000:

7C0B07POPES#ES=0000:

7c00

0000:

7C0C50PUSHAX

0000:

7C0D1FPOPDS#DS=0000:

7c00

0000:

7C0EFBSTI#开中断

0000:

7C0FFCCLD#清除方向

0000:

7C10BF0006MOVDI,0600#DI=0600

0000:

7C13B90001MOVCX,0100#移动256个word(512bytes)

0000:

7C16F2REPNZ#把MBR从0000:

7c00

0000:

7C17A5MOVSW#移动到0000:

0600

0000:

7C18EA1D060000JMP0000:

061D#跳至NEW_LOCATION

NEW_LOCATION:

#NOWAT0000:

0600

0000:

061DBEBE07MOVSI,07BE#指向入口的第一个字节

0000:

0620B304MOVBL,04#有4个入口

SEARCH_LOOP1:

#查找活动分区

0000:

0622803C80CMPBYTEPTR[SI],80#是不是活动分区?

0000:

0625740EJZFOUND_ACTIVE#是,栈指针指向7c00

0000:

0627803C00CMPBYTEPTR[SI],00#是不是不活动分区?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1