主引导记录(MBR,Main Boot Record)是位于磁碟最前边的一段引导(Loader)代码。它负责磁碟作业系统(DOS)对磁碟进行读写时分区合法性的判别、分区引导信息的定位,它由磁碟作业系统(DOS)在对硬碟进行初始化时产生的。
简介
通常,我们将包含MBR引导代码的扇区称为主引导扇区。因这一扇区中,引导代码占有绝大部分的空间,故而将习惯将该扇区称为MBR扇区(简称MBR)。由于这一扇区承担有不同于磁碟上其他普通存储空间的特殊管理职能,作为管理整个磁碟空间的一个特殊空间,它不属于磁碟上的任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息。主引导扇区由三个部分组成(共占用512个位元组):
MBR结构图

1.主引导程式即主引导记录(MBR)(占446个位元组)
可在FDISK程式中找到,它用于硬碟启动时将系统控制转给用户指定的并在分区表中登记了的某个作业系统。
2.磁碟分区表项(DPT,Disk Partition Table)
由四个分区表项构成(每个16个位元组)。
负责说明磁碟上的分区情况,其内容由磁碟介质及用户在使用FDISK定义分区时决定。(具体内容略)
3.结束标誌(占2个位元组)
其值为AA55,存储时低位在前,高位在后,即看上去是55AA(十六进制)。
详解
MBR的读取
硬碟的引导记录(MBR)是不属于任何一个作业系统,也不能用作业系统提供的磁碟操作命令来读取它。但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软体工具Norton8.0中的DISKEDIT.EXE来读取。
用INT13H的读磁碟扇区功能的调用参数如下:
入口参数:AH=2 (指定功能号)
AL=要读取的扇区数
DL=磁碟号(0、1-软碟;80、81-硬碟)
DH=磁头号
CL高2位+CH=柱面号
CL低6位=扇区号
CS:BX=存放读取数据的记忆体缓冲地址
出口参数:CS:BX=读取数据存放地址
错误信息:如果出错CF=1 AH=错误代码
用DEBUG读取位于硬碟0柱面、0磁头、1扇区的操作如下:
A>DEBUG
-A 100
XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)
XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)
XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)
XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)
XXXX:XXXX INT 13
XXXX:XXXX INT 3
XXXX:XXXX (按回车键)
-G=100 (执行以上程式段)
-D 1000 11FF (显示512位元组的MBR内容)
MBR的组成
一个扇区的硬碟主引导记录MBR由如图6-15所示的4个部分组成。
·主引导程式(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程式。
·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0位元组。
·分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个位元组,共64位元组为分区项1、分区项2、分区项3、分区项4。
·结束标誌字,偏移地址01FE--01FF的2个位元组值为结束标誌55AA,如果该标誌错误系统就不能启动。
0000-0088 | Master Boot Record 主引导程式 | 主引导 程式 |
0089-01BD | 出错信息数据区 | 数据区 |
01BE-01CD | 分区项1(16位元组) | 分区表 |
01CE-01DD | 分区项2(16位元组) | |
01DE-01ED | 分区项3(16位元组) | |
01EE-01FD | 分区项4(16位元组) | |
01FE | 55 | 结束标誌 |
01FF | AA |
图6-15 MBR的组成结构图
MBR中的分区信息结构
占用512个位元组的MBR中,偏移地址01BEH--01FDH的64个位元组,为4个分区项内容(分区信息表)。它是由磁碟介质类型及用户在使用 FDISK定义分区说确定的。在实际套用中,FDISK对一个磁碟划分的主分区可少于4个,但最多不超过4个。每个分区表的项目是16个位元组,其内容含义如表6-19所示。
表6-19 分区项表(16位元组)内容及含义
存贮位元组位 | 内容及含义 |
第1位元组 | 引导标誌。若值为80H表示活动分区,若值为00H表示非活动分区。 |
第2、3、4位元组 | 本分区的起始磁头号、扇区号、柱面号。其中: 磁头号——第2位元组; 扇区号——第3位元组的低6位; 柱面号——为第3位元组高2位+第4位元组8位。 |
第5位元组 | 分区类型符。 00H——表示该分区未用(即没有指定); 06H——FAT16基本分区; 0BH——FAT32基本分区; 05H——扩展分区; 07H——NTFS分区; 0FH——(LBA模式)扩展分区(83H为Linux分区等)。 |
第6、7、8位元组 | 本分区的结束磁头号、扇区号、柱面号。其中: 磁头号——第6位元组; 扇区号——第7位元组的低6位; 柱面号——第7位元组的高2位+第8位元组。 |
第9、10、11、12位元组 | 本分区之前已用了的扇区数。 |
第13、14、15、16位元组 | 本分区的总扇区数。 |
MBR的主要功能及工作流程
启动PC机时,系统首先对硬体设备进行测试,测试成功后进入自举程式INT 19H,然后读系统磁碟0柱面、0磁头、1扇区的主引导记录(MBR)内容到记忆体指定单元0:7C00地址开始的区域,并执行MBR程式段。
硬碟的主引导记录(MBR)是不属于任何一个作业系统的,它先于所有的作业系统而被调入记忆体,并发挥作用,然后才将控制权交给主分区(活动分区)内的作业系统,并用主分区信息表来管理硬碟。
MBR程式段的主要功能如下:
·检查硬碟分区表是否完好。
·在分区表中寻找可引导的“活动”分区。
·将活动分区的第一逻辑扇区内容装入记忆体。在DOS分区中,此扇区内容称为DOS引导记录(DBR)。
硬碟逻辑驱动器的分区表链结构
硬碟是由很多个512位元组的扇区组成,而这些扇区会被组织成一个个的“分区”。
硬碟的分区规则是:一个分区的所有扇区必须连续,硬碟可以有最多4个物理上的分区,这4个物理分区可以是4个主分区或者3个主分区加一个扩展分区。在DOS/Windows管理下的扩展分区里,可以而且必须再继续划分逻辑分区(逻辑盘)。
从MS-DOS3.2问世以后,用户就可以在一个物理硬碟驱动器上划分一个主分区和一个扩展分区,并在扩展分区上创建多个逻辑驱动器,也即我们常说的一个物理盘上多个逻辑盘。
举一个例子,一个10G的硬碟,安装Windows,有C:、D:、E:三个逻辑盘,那幺它的分区情况可以是如下的方式:
分区一:主分区2GB,格式化为C:盘。
分区二:扩展分区8GB。它被再划分为两个各4GB的逻辑盘,格式化为以D:和E:盘。
在一个划分有多个主分区的硬碟上,则可安装多个不同的作业系统。如Windows、Linux、Solaris等。每个作业系统自己去管理分配给自己的分区。但是,每个作业系统对分区的操作方式是不同的。对于DOS/Windows来说,它能够把它所能管辖的一个主分区和一个扩展分区格式化,然后按照 C:、D:、E:逻辑盘的方式来管理。而Linux则不同,它是把“分区”看作一个设备,既没有“扩展分区”的概念,也没有“逻辑盘”的概念。
1.逻辑盘的连结关係
在FAT 档案系统中,硬碟的逻辑盘字元用字元C:、D:、E:、...、Z:来表示。主分区一般被格式化成C:盘,从D:盘开始的逻辑盘是建立在扩展分区之上的。在系统进行读写操作时,DOS首先查看主引导记录(MBR)中的分区信息表,分区项将指向活动主分区的DOS引导记录(DBR)。
MBR中的分区表位于0柱面、0磁头、1扇区内,以位移1BEH开始的第一分区表作为链首,有表内的连结表项指示下一分区表的物理位置(xx柱面、0磁头、1扇区),在该位置的扇区内同样位移1BEH处,保存着第2张分区表,依次类推,直至指向最后一张分区表的物理位置(yy柱面、0磁头、1扇区)。因该分区表内不存在连结表项,即作为分区表链的链尾。如图6-17所示。
硬碟 第一个虚拟 第二个虚拟 第三个虚拟
MBR分区表 MBR分区表 MBR分区表 MBR分区表
定义C:盘 | ------------> | 定义D:盘 | -----------> | 定义E:盘 | ------------> | 定义F:盘 |
描述剩余空间 | 描述剩余空间 | 描述剩余空间 | 描述剩余空间 | |||
未用 | 未用 | 未用 | 未用 | |||
未用 | 未用 | 未用 | 未用 | |||
55AA | 55AA | 55AA | 55AA |
图6-17 具有4个逻辑盘的分区鍊表示意图
举例来说,本来位于柱面0、磁头0、扇区1上的分区表的每一项记录和主分区的DBR之间有一对应的关係,但是,如果在扩展分区中建立了多个逻辑盘,例如D:、E:、F:,该分区表中的分区项可指向第一个逻辑盘:,但对于其它的逻辑盘,则就没有这种对应关係了。为能够查找扩展分区中的多个逻辑盘,DOS系统可做如下安排:
·如果硬碟只有一个主分区,即是将整个硬碟作为一个逻辑盘C:,则分区命令FDISK只在硬碟的柱面0、磁头0、扇区1上建立一个MBR。
·如果硬碟被划分成2--4个分区,则FDISK除了在柱面0、磁头0、扇区1上建立一个MBR之外,还在扩展分区的每个逻辑盘的起始扇区上都建立一个虚拟MBR,每一个虚拟MBR用于扩展分区上的一个逻辑盘。
·扩展分区的第一个扇区不是用于一个逻辑盘的DBR,而是指向一个“扩展的”分区表,即第一个虚拟的MBR。该逻辑盘DBR扇区的起点应为虚拟MBR的下一个磁轨1扇区。
这些MBR中的各个分区表连结成一个如图6-17所示的分区表链。这是一个硬碟具有4个表项所描述的内容。
DOS就是用这种方法来使一个扩展分区看起来象是有多个硬碟。
从图6-17中可以看到,位于磁碟柱面0、磁头0、扇区1上MBR的分区表指向基本分区及扩展分区中的第一个逻辑盘。
主引导记录的组成
1.1启动代码
主引导记录最开头是第一阶段引导代码。其中的硬碟引导程式的主要作用是检查分区表是否正确并且在系统硬体完成自检以后将控制权交给硬碟上的引导程式(如GNU GRUB)。 它不依赖任何作业系统,而且启动代码也是可以改变的,从而能够实现多系统引导。
1.2硬碟分区表
硬碟分区表占据主引导扇区的64个位元组(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个位元组。具体每个位元组的定义可以参见硬碟分区结构信息。下面是一个例子:如果某一分区在硬碟分区表的信息如下
80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00
则我们可以看到,最前面的“80”是一个分区的激活标誌,表示系统可引导[1];“01 01 00”表示分区开始的磁头号为1,开始的扇区号为1,开始的柱面号为0;“0B”表示分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS);“FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;“3F 00 00 00”表示首扇区的相对扇区号为63;“7E 86 BB 00”表示总扇区数为12289662。
对于现代大于8.4G的硬碟,CHS已经无法表示, BIOS使用LBA模式,对于超出的部分,CHS值通常设为 FEFFFF, 并加以忽略,直接使用08-0f的4位元组相对值,再进行内部转换。
硬碟分区表结构信息
长度 | 意义 |
1位元组 | 引导标誌(Boot Indicator):00-->非活动分区;80--> 活动分区;其它数值没有意义 |
1位元组 | 开始磁头(Start Head) |
6位 | 起始扇区(Start Sector):使用1个位元组中的低6位,即0~5位 |
10位 | 起始柱面(Start Cylinder):使用上个位元组中的高2位,再加上1个位元组8位,共10位 |
1位元组 | 分区类型描述(Partition type indicator):定义了分区的类型 |
1位元组 | 结束磁头(End Head) |
6位 | 结束扇区(End Sector ) 使用1个位元组中的低6位,即0~5位 |
10位 | 结束柱面(End Cylinder )使用上个位元组中的高2位,再加上1个位元组8位,共10位 |
4位元组 | 本分区之前使用的扇区数(Sector preceding partition):该分区的起始物理扇区地址 |
4位元组 | 本分区的总扇区数(Sector in partition):该分区所包含的扇区总数 |
1.3结束标誌字
结束标誌字55 AA(偏移1FEH-偏移1FFH)最后两个位元组,是检验主引导记录是否有效的标誌。
主引导扇区的读取流程
系统开机或者重启时主引导扇区的读取流程如下所述。
1.BIOS 加电自检 ( Power On Self Test -- POST )。BIOS执行记忆体地址为 FFFF:0000H 处的跳转指令,跳转到固化在ROM中的自检程式处,对系统硬体(包括记忆体)进行检查。
2.读取主引导记录(MBR)。当BIOS检查到硬体正常并与 CMOS 中的设定相符后,按照 CMOS 中对启动设备的设定顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入记忆体地址为0000:7C00H 处。
3.检查0000:7CFEH-0000:7CFFH(MBR的结束标誌位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示“NO ROM BASIC”然后当机。
4.当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己複製到0000:0600H处,然后继续执行。
5.根据MBR中的引导代码启动引导程式。
事实上,BIOS不仅检查0000:7CFEH-0000:7CFFH(MBR的结束标誌位)是否等于55AAH,往往还对磁碟是否有防写、主引导扇区中是否存在活动分区等进行检查。如果发现磁碟有防写,则显示磁碟防写出错信息;如果发现磁碟中不存在活动分区,则显示类似如下的信息“Remove disk or other media Press any key to restart”。
主引导记录与硬碟分区
从主引导记录的结构可以知道,它仅仅包含一个64个位元组的硬碟分区表。由于每个分区信息需要16个位元组,所以对于採用MBR型分区结构的硬碟,最多只能识别4个主要分区(Primary partition)。所以对于一个採用此种分区结构的硬碟来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。[2]
扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。
Windows系统默认情况下,一般都是只划分一个主分区给系统,剩余的部分全部划入扩展分区。这里有下面几点需要注意:
在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。
在Linux系统中,硬碟分区命名为sda1-sda4或者hda1-hda4(其中a表示硬碟编号可能是a、b、c等等)。在MBR硬碟中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬碟,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬碟的前2T空间内。[3]如果硬碟太大则必须改用GPT。
MBR分区表与GPT分区表的关係
与支持最大卷为2 TB(Terabytes)并且每个磁碟最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁碟分区的样式相比,GPT磁碟分区样式支持最大卷为128 EB(Exabytes)并且每磁碟的分区数没有上限,只受到作业系统限制(由于分区表本身需要占用一定空间,最初规划硬碟分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标準规定的分区表的最小尺寸)。与MBR分区的磁碟不同,至关重要的平台运算元据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁碟有备份分区表来提高分区数据结构的完整性。
注释
[1]对于一个作业系统而言,系统分区设为活动分区并不是必须的,这主要视引导程式而定,如果使用的引导程式是Grub4Dos,MBR中的引导代码仅仅按照分区的顺序依次探测第二阶段引导器grldr的位置,并运行第一个探测到的grldr档案。
[2]一个硬碟的分区个数还要受到分区大小的限制,因为硬碟是按照柱面分区的:一个分区至少要占一个柱面。但有一点需要注意,由于现在的硬碟结构已经和老式硬碟有了很大区别,其定址结构也不再是CHS定址,所以这里的柱面大小不同于相关软体显示的柱面大小。对于物理结构上有n个面的硬碟,其分区空间的最小值为:n × 扇区/磁轨 × 512位元组。
[3]根据16位元组分区表的结构:当前分区的扇区数用4个位元组表示,前面各分区扇区数的总和也是4个位元组,而232 × 512 = 2 199 023 255 552 Byte