1、硬盘主引导扇区(MBR、DPT、DBR、BPB)详解.txt“恋”是个很强悍的字。它的上半部取自“变态”的“变” ,下半部取自“变态”的“态” 。硬盘主引导扇区(MBR、DPT、DBR、BPB)详解引用:网上收集的资料,放到这里来学习,这方面登山人大哥是高手,有空指点一下喽硬盘的 0 柱面、0 磁头、1 扇区称为主引导扇区(也叫主引导记录 MBR) ,该记录占用 512 个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。MBR 的内容是在硬盘分区时由分区软件(如 FDISK)写入该扇区的,MBR 不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,M
2、BR 也不会夹带操作系统的性质,具有公共引导的特性。但安装某些多重引导功能的软件或 LINUX 的 LILO 时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(图一) 。MBR 由三部分构成:1主引导程序代码,占 446 字节2硬盘分区表 DPT,占 64 字节3主引导扇区结束标志 AA55H一、硬盘的主引导程序代码是从偏移 0000H 开始到偏移 01BDH 结束的 446 字节;主引导程序代码包括一小段执行代码。启动 PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序 INT 19H;然后读系统磁盘 0 柱面、0 磁头、1 扇区的主
3、引导扇区 MBR 的内容到内存指定单元 0:7C00 首地址开始的区域,并执行 MBR 程序段。主引导代码实现下列功能:1扫描分区表查找活动分区;2寻找活动分区的起始扇区;3将活动分区的引导扇区读到内存;4执行引导扇区的运行代码。如果主引导代码未完成这些功能,系统显示下列错误信息:Invalid partition tableError loading operating systemMissing operating system二、硬盘分区表 DPT 是从偏移 01BEH 开始到偏移 01FDH 结束的 64 字节(图二) ;硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占 16
4、字节。在这里我们可以看出,硬盘的总分区数为什么不能大于 4。其中可激活分区数不得大于 3,扩展分区数不得大于 1,当前活动分区数必须小于等于 1。分区表的每一分区的第 0 个字节是自举标志,其值为 80H 时,表示该分区是当前活动分区,可引导,其值为 00H 时,表示该分区不可引导。第 4 字节是分区类型(图三) 。每一分区的第 1 至第 3 字节是该分区起始地址。其中第 1 字节为起始磁头号(面号) ;第 2 字节的低 6 位为起始扇区号,高 2 位则为起始柱面号的高 2 位;第 3 字节为起始柱面号的低 8 位。因此,分区的起始柱面号是用 10 位二进制数表示的,最大值为 210 = 10
5、24,因逻辑柱面号从 0 开始计,故柱面号的显示最大值为 1023。同理,用 6 位二进制数表示的扇区号不会超过 26 - 1 = 63;用 8 位二进制数表示的磁头号不会超过 28 - 1 = 255。每一分区的第 5 至第 7 字节表示分区的终止地址,各字节的释义与第 1 至第 3 字节相同。这里我们假设一种极端的情况:如果让第 5 至第 7 字节的所有二进制位都取 1,就获得了柱面号、磁头号和扇区号所能表示的最大值,从而得到最大绝对扇区号为:1024 256 63 = 16,515,072这个扇区之前的所有物理扇区所包含的字节数为:16,515,072 512Bytes 8.46109B
6、ytes = 8.46GB。由此可知硬盘的容量设计为什么会有 8.4GB 这一档,分区表每一分区的第 1 至第 3 字节以及第 5 至第 7 字节的数据结构已经不能满足大于 8.46GB 的大容量硬盘的需要。考虑到向下兼容的需要,业界并未对从 DOS 时代就如此定义的硬盘分区表提出更改意见,否则改动所牵涉的面太广,会造成硬件和软件发展上的一个断层,几乎无法被业界和用户所接受。硬盘厂商解决这一问题的方法是定义了新的 INT 13 服务扩展标准。新的 INT 13 服务扩展标准不再使用操作系统的寄存器传递硬盘的寻址参数,而使用存储在操作系统内存里的地址包。地址包里保存的是 64 位 LBA 地址,
7、如果硬盘支持 LBA 寻址,就把低 28 位直接传递给 ATA 接口,如果不支持,操作系统就先把 LBA 地址转换为 CHS 地址,再传递给 ATA 接口。通过这种方式,能实现在 ATA 总线基础上 CHS 寻址的最大容量是 136.9 GB,而 LBA 寻址的最大容量是137.4GB。新的硬盘传输规范 ATA 133 规范又把 28 位可用的寄存器空间提高到 48 位,从而支持更大的硬盘。分区表每一分区的第 8 至第 11 字节表示该分区的起始相对扇区数(即该扇区之前的绝对扇区个数) ,高位在右,低位在左;第 12 至第 15 字节表示该分区实际占用的扇区数,也是高位在右,低位在左;分区表这
8、类数据结构的表达方式与机器中数据的实际存储方式在顺序上是一致的,即低位在前,高位在后。因此,在从 16 进制向十进制作数值转换时,需将字段中的 16 进制数以字节为单位翻转调位,用 4 个字节可以表示最大 232 个扇区,即2TB=2048GB。系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。在未超过 8.4GB 的分区上,C/H/S 的表示方法和扇区数的表示方法所表示的分区大小是一致的。超过 8.4GB 的/H/S/C 一般填充为 FEH/FFH/FFH,即 C/H/S 所能表示的最大值;有时候也会用柱面对 1024 的模来填充。不过这几个字节是什么其实都无关
9、紧要了。扩展分区中的每个逻辑驱动器都存在一个类似于 MBR 的扩展引导记录(Extended Boot Record,EBR) (图四) 。扩展引导记录包括一个扩展分区表和扇区结束标志 55AA。一个逻辑驱动器中的引导扇区一般位于相对扇区 32 或 63。如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区;第二项指向下一个逻辑驱动器的 EBR,如果不存在进一步的逻辑驱动器,第二项就不会使用,而被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区,第二个逻辑驱动器的扩展分区表
10、的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。扩展分区表项中的相对扇区数是从扩展分区开始的扇区到该逻辑驱动器中第一个扇区的扇区数;占用的扇区数是指组成该逻辑驱动器的扇区数目。有时候在磁盘的末尾会有剩余空间,由于分区是以 1 柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。三、主引导扇区的最后两个字节(偏移 1FEH 和偏移 1FFH) ,其值为 AA55H,它表示该扇区是个有效的引导扇区,可用来引导硬磁盘系统。分区引导扇区 DBR(DOS BOOT RECORD)
11、是由 FORMAT 高级格式化命令写到该扇区的内容;DBR是由硬盘的 MBR 装载的程序段。DBR 装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区的 DBR 才会被 MBR 装入内存运行。DBR 主要由下列几个部分组成:1跳转指令,占用 3 个字节的跳转指令将跳转至引导代码。2厂商标识和 DOS 版本号,该部分总共占用 8 个字节。3BPB(BIOS Parameter Block, BIOS 参数块) 。4操作系统引导程序。5结束标志字,结束标志占用 2 个字节,其值为 AA55DBR 中的内容除了第 5
12、部分结束标志字固定不变之外,其余 4 个部分都是不确定的,其内容将随格式化所用的操作系统版本及硬盘的逻辑盘参数的变化而变化。一、FAT32 的分区引导扇区为了使加载文件的操作更加灵活,加上 FAT32 文件系统采用“活动“的 FDT 表, ,同时考虑到引导程序的代码量和为今后发展保留适当的余量,FAT32 文件系统分区引导扇区占据了6 个扇区,只有前 3 个扇区作为系统的分区引导扇区,其余 3 个扇区保留暂未使用。分区引导扇区对于操作系统的启动和磁盘文件的访问具有至关重要的作用;引导程序代码的损坏将导致操作系统不能正常启动,磁盘读写参数的破坏将造成存储在磁盘上的文件不能正常读写。由于分区引导扇
13、区的重要性,FAT32 文件系统在在第一个分区引导扇区的 6 个扇区后的6 个扇区里保留了分区引导扇区的备份,在启动时操作系统可以对两份引导扇区进行比较,以便选择正确的引导扇区来引导系统。由于在磁盘正常工作过程中系统不再对引导扇区的程序和数据进行修改,因此备份的分区引导扇区损坏的可能性非常小。分区引导扇区的第一个扇区(图六)的前三个字节是一条跳转指令,然后是 8 个字节长的 OEM ID(厂家标识)和版本号,其后是简称为 BPB 的 BIOS 参数块(BIOS Parameter Block) 。对于 FAT32 其各部分的意义如下表:偏移地址长度(字节)意 义0BH2每个扇区的字节数,常取
14、512。 0DH1每簇扇区数;可以是 1, 2, 4, 8, 16, 32, 64, 128,取决于文件系统格式及分区大小。 0EH2为操作系统保留的扇区数;FAT32 时多为十进制的 32,FAT16 时为 1,有的格式化工具可能将它设为 36 或 63。 10H1FAT 表的个数;常取 2。 11H2在 FAT16 中存放系统根目录中允许登记的目录项个数,FAT32 中用于标注系统采用的是否为 FAT32 文件系统。其值为 0000H 表示磁盘使用 FAT32 文件系统。 13H2值为 00H,为保持兼容性而保留,未使用。 15H1磁盘介质标志,硬盘为 F8。 16H2未使用,值为 00H
15、。 18H2每个磁道的扇区数。 1AH2磁盘的磁头数。 1CH4分区前隐藏扇区的个数。 20H4逻辑磁盘中的扇区总数。 24H4每个 FAT 表所占的扇区数。 28H2FAT 表镜像标志,值为 0 表示系统保存 2 份互为备份的 FAT 表,值为 1 表示系统仅保存 1份 FAT 表。 2AH2文件系统的主次版本(保留) 。 2CH4磁盘根目录的起始簇号。 30H2文件系统参数的扇区号,通常位于引导扇区的下一个扇区。 32H2备份分区引导扇区的逻辑扇区号。 34H12保留,未使用。 40H1中断 13 呼叫的预设值,指明访问的设备;软盘为 00H,硬盘为 80H。 41H1用于中断 13 呼叫
16、。 42H1磁盘读写参数扩展标志,其值为 29H。 43H4格式化时随机产生的磁盘卷的序列号。 47H11格式化时人工输入的磁盘卷标号。 52H8文件系统的标识号(FAT32) 。 从偏移 0x5A 开始的数据为操作系统引导代码。这是由偏移 0x00 开始的跳转指令所指向的,此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。扇区的最后两个字节存储值为 0x55AA 的 DBR 有效标志,对于其他的取值,系统将不会执行 DBR 相关指令。分区引导扇区的第 2 个扇区作为文件系统相关参数存储标识扇区(图七) ,除了保存扇区的标识信息(RraA(00H)和 rrAa(1E4H) )外,
17、还可能在偏移地址 1E8H 处存储了文件系统有关的信息。其中扇区偏移地址 1E8H1EBH 的 4 个字节存储了逻辑磁盘中未使用的簇数,通常用于快速计算逻辑磁盘的剩余空间(典型的操作是在资源管理器状态栏上列出的“可用磁盘空间“参数) ,而 1ECH1EFH 4 个字节给出了逻辑盘中下一个可以分配给文件使用的空闲簇的簇号,这样操作系统可以不访问 FAT 表就直接获得磁盘剩余空间和可以分配的簇号。分区引导扇区的第 3 个扇区则存储了引导扇区的后一部分引导系统的程序代码(图八) 。二、NTFS 的分区引导扇区对于 NTFS 分区来说,分区引导扇区 DBR 只占用一个扇区(图五) ,并且在该分区的最后
18、一个扇区做了备份;NTFS 的引导扇区也是完成引导和定义分区参数,NTFS 分区的引导扇区不是分区的充分条件,它要求必须 MFT 中的系统记录如$MFT 等正常该分区才能正常访问。其 BPB 参数如下表所示: 偏移地址长度(字节)常用值意 义0x0B20x0002每扇区字节数 0x0D10x08每簇扇区数 0x0E20x0000保留扇区 0x1030x000000总为 0 0x1320x0000NTFS 未使用,为 0 0x1510xF8 介质描述 0x1620x0000总为 0 0x1820x3F00每磁道扇区数 0x1A20xFF00磁头数 0x1C40x3F000000隐藏扇区数 0x2
19、040x00000000NTFS 未使用,为 0 0x2880x4AF57F0000000000扇区总数0x3080x0400000000000000 $MFT 的逻辑簇号 0x3880x54FF070000000000$MFT Mirr 的逻辑簇号 0x4040xF6000000每 MFT 记录簇数 0x44 40x01000000每索引簇数 0x4880x14A51B74C91B741C卷标 0x5040x00000000检验和 本帖最后由 伐木者 于 2007-6-19 20:11 编辑 附件: 您所在的用户组无法下载或查看附件本文来自:创幻论坛 http:/ UID55456 帖子 9
20、783 精华 45 积分 47222 威望 0 金币 0 阅读权限 18 性别男 来自有树砍的地方 在线时间 8494 小时 注册时间 2004-5-16 最后登录 2010-4-5 查看详细资料TOP 【推荐】权威专家推荐涨停股票请点击获取 伐木者 魏武王常所用论坛超级版主电脑家园区总版主积分 47222 威望 0 注册时间 2004-5-16 发短消息 加为好友 沙发 大 中 小 发表于 2007-6-17 20:55 只看该作者 How It Works - Master Boot Record (主启动记录)本文是介绍 MBR 的反编译程序的。MBR 是放在硬盘的 0 柱面,0 磁头(
21、head),1 扇区的 那一段区。MBR 是由 FDISK 程序创建的。所有操作系统的 FDISK 程序都会创建类似的 MBR 记录。MBR 是多个分区的前提,每个 MBR 中包括了四个分区表记录。在您的计算机加电 之后,INT19 被调用了。一般来说,INT19 先从第一个软盘驱动器中读启动扇区记录。 如果在软盘中找到了启动的扇区,那么这个扇区的数据就被读入到内存的 0000:7c00 地址上,INT19 也跳到了这个地址上。但是,如果没有在软盘中找到这个扇区的话,INT 19 就从第一个硬盘中去读。同样,如果成功的话,也会把 MBR 导入到相同的内存地址 0000:7c00,INT19 也
22、会跳这个地址。MBR 中包括的一段小程序是定出在分区表中的活动分 区。这样的活动分区找到之,那个分区的启动扇区也被读入到 0000:7c00 地址,MBR 程序 也转移到了这个地址。每一个操作系统都有固定的启动扇区的格式。在启动扇区里的程 序要能定出操作系统启动程序的位置(或是核心本身,或者是一个启动管理器) ,然后 将它读入内存。 另:在 Ctrl-Alt-Del 键被按下时,INT19 也会被调用。在大多数系统中,Ctrl-Alt-Del 三?nbsp;键同时按下表示热启动您的计算机,回到 INT19 调用前的状态。 = 数据存放的位置: MBR 程序放在偏移为 0000 的位置。 MBR
23、 消息放在偏移为 008b 的位置。 分区表放在偏移为 00be 的位置。 签名放在偏移为 00fe 的位置。 关于谁干什么事的总结: 如果一个活动分区找到了,这个分区的启动数据被读入到 0000:7c00 的位置,MBR 程 序也跳到 0000:7c00 的位置。这段程序找到指向分区表的入口,入口描述的是这段分区是 怎样被启动的。启动程序用这些数据来决定用来启动的驱动器和这个驱动器分区在硬盘上 的位置。 如果没有找到这样的活动分区入口,ROM BASIC 会转入 INT 18 的调用。所有其他的错 误导致系统的挂起,可以看 HANG 的标记。 注意(非常之重要): )活动分区入口的第一个字节
24、的内容是 80h。在 INT13 被调用之前,这个字节被导 入到 DL 寄存器中。当 INT13 被调用时,DL 表示的是 BIOS 的设备号码。因为这个原因,由MBR 程序读的启动扇区只能从 BIOS 设备号码为 80 的硬盘中读入。这便是为什么不能从任何硬盘 启动的原因。?nbsp;)MBR 程序是用基于 INT 13h (ah=02h)的中断的 CHS 来读取活动分区的启动扇区位置 的。活动分区的启动扇区内的位置是在分区表内用 CHS 格式表明的。如果这个驱动器小于 528M,这个 CHS 一定要是(L-CHS,见 BIOS TYPES 文档)。在 LBA 中没有任何地址是有用的。 (另
25、一个 LBA 不能解决528M 问题的原因) 这点大家别信,西西。 = 这是一张整个 MBR 记录的表(hex 和 ascii 格式) OFFSET 0 1 2 3 4 5 6 7 8 9 A B C D E F *0123456789ABCDEF* 000000 fa33c08e d0bc007c 8bf45007 501ffbfc *.3.|.P.P.* 000010 bf0006b9 0001f2a5 ea1d0600 00bebe07 *.* 000020 b304803c 80740e80 3c00751c 83c610fe *.x.* 0001d0 00000000 0000000
26、0 00000000 00000000 *.* 0001e0 00000000 00000000 00000000 00000000 *.* 0001f0 00000000 00000000 00000000 000055aa *.U.* = 这是 MBR 的反编译程序: 这个扇区被导入到内存的 0000:7c00 位置,但是它又马上将自己重定位到 0000:0060 的 位?nbsp;。 BEGIN: # NOW AT 0000:7C00, RELOCATE 0000:7C00 FA CLI #禁止中断 0000:7C01 33C0 XOR AX,AX #设置堆栈段地址为 0000 0000
27、:7C03 8ED0 MOV SS,AX 0000:7C05 BC007C MOV SP,7C00 #设置堆栈指针为 7c00 0000:7C08 8BF4 MOV SI,SP #SI = 7c00 0000:7C0A 50 PUSH AX 0000:7C0B 07 POP ES #ES = 0000:7c00 0000:7C0C 50 PUSH AX 0000:7C0D 1F POP DS #DS = 0000:7c00 0000:7C0E FB STI #开中断 0000:7C0F FC CLD #清除方向 0000:7C10 BF0006 MOV DI,0600 #DI = 0600 0
28、000:7C13 B90001 MOV CX,0100 #移动 256 个 word (512 bytes) 0000:7C16 F2 REPNZ #把 MBR 从 0000:7c00 0000:7C17 A5 MOVSW #移动到 0000:0600 0000:7C18 EA1D060000 JMP 0000:061D #跳至 NEW_LOCATION NEW_LOCATION:# NOW AT 0000:0600 0000:061D BEBE07 MOV SI,07BE #指向入口的第一个字节 0000:0620 B304 MOV BL,04 #有 4 个入口 SEARCH_LOOP1:
29、# 查找活动分区 0000:0622 803C80 CMP BYTE PTR SI,80 #是不是活动分区? 0000:0625 740E JZ FOUND_ACTIVE #是,栈指针指向 7c00 0000:0627 803C00 CMP BYTE PTR SI,00 #是不是不活动分区? 0000:062A 751C JNZ NOT_ACTIVE #跳转至 NOT_ACTIVE 0000:062C 83C610 ADD SI,+10 #增量表指针加 16 0000:062F FECB DEC BL #减少计数 0000:0631 75EF JNZ SEARCH_LOOP1 #循环 0000
30、:0633 CD18 INT 18 #跳至 ROM BASIC FOUND_ACTIVE: # 找到了活动分区 0000:0635 8B14 MOV DX,SI #设置 DH/DL 为 INT 13 0000:0637 8B4C02 MOV CX,SI+02 #设置 CH/CL 为 INT 13 0000:063A 8BEE MOV BP,SI #保存表指针 SEARCH_LOOP2: # 确定是一个活动分区 0000:063C 83C610 ADD SI,+10 #增量表指针加 16 0000:063F FECB DEC BL #减少计数 0000:0641 741A JZ READ_BOOT #如果表结束,跳转 0000:0643 803C00 CMP BYTE PTR SI,00 #是不是非活动分区 0000:0646 74F4 JZ SEARCH_LOOP2 #是,循环