主引导记录
![本页使用了标题或全文手工转换](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
主引导记录(英语:Master Boot Record,缩写:MBR),又叫做主引导扇区,是电脑开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁碟分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。
地址 | 描述 | 长度 (字节) | |||
---|---|---|---|---|---|
Hex | Oct | Dec | |||
0000
|
0000
|
0 | 代码区 | 440 (最大446) | |
01B8
|
0670
|
440 | 选用磁碟标志 | 4 | |
01BC
|
0674
|
444 | 一般为空值; 0x0000 | 2 | |
01BE
|
0676
|
446 | 标准MBR分区表规划 (四个16 byte的主分区表入口) |
64 | |
01FE
|
0776
|
510 | 55h | MBR有效标志: 0x55AA |
2 |
01FF
|
0777
|
511 | AAh | ||
MBR,总大小:446 + 64 + 2 = | 512 |
主引导扇区记录着硬盘本身的相关资讯以及硬盘各个分区的大小及位置资讯,是数据资讯的重要入口。如果它受到破坏,硬盘上的基本数据结构资讯将会丢失,需要用繁琐的方式试探性的重建数据结构资讯后才可能重新访问原先的数据。主引导扇区内的资讯可以通过任何一种基于某种操作系统的分区工具软件写入,但和某种操作系统没有特定的关系,即只要建立了有效的主引导记录就可以引导任意一种操作系统(操作系统是建立在高级格式化的硬盘分区之上,是和一定的文件系统相联络的)。
对于硬盘而言,一个扇区可能的字节数为128×2n(n=0,1,2,3)。大多情况下,取n=2,即一个扇区(sector)的大小为512字节。
主引导记录的组成
启动代码
主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。
硬盘分区表
偏移 | 长度(字节) | 意义 |
---|---|---|
00H | 1 | 分区状态:00-->非活动分区;80-->活动分区; 其它数值没有意义 |
01H | 1 | 分区起始磁头号(HEAD),用到全部8位 |
02H | 2 | 分区起始扇区号(SECTOR),占据02H的位0-5; 该分区的起始磁柱号(CYLINDER),占据 02H的位6-7和03H的全部8位 |
04H | 1 | 文件系统标志位 |
05H | 1 | 分区结束磁头号(HEAD),用到全部8位 |
06H | 2 | 分区结束扇区号(SECTOR),占据06H的位0-5; 该分区的结束磁柱号(CYLINDER),占据 06H的位6-7和07H的全部8位 |
08H | 4 | 分区起始相对扇区号 |
0CH | 4 | 分区总的扇区数 |
硬盘分区表占据主引导扇区的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值通常设为0xFEFFFF,并加以忽略,直接使用Offset 0x08-0x0c的4字节相对值,再进行内部转换。
结束标志字
结束标志字55,AA(偏移1FEH-偏移1FFH)最后两个字节,是检验主引导记录是否有效的标志。
主引导扇区的读取流程
- 系统开机或者重启。
- BIOS加电(台湾用语:开机)自检(Power On Self Test -- POST)。BIOS执行内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件(包括内存)进行检查。
- 读取主引导记录(MBR)。当BIOS检查到硬件正常并与CMOS中的设置相符后,按照CMOS中对启动装置的设置顺序检测可用的启动装置。BIOS将相应启动装置的第一个扇区(也就是MBR扇区)读入内存地址为0000:7C00H处。
- 检查0000:01FEH-0000:01FFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动装置,如果没有启动装置满足要求则显示"NO ROM BASIC"然后当机。
- 当检测到有启动装置满足要求后,BIOS将控制权交给相应启动装置。启动装置的MBR将自己复制到0000:0600H处,然后继续执行。
- 根据MBR中的引导代码启动引导程序。
- 事实上,BIOS不仅检查0000:01FEH-0000:01FFH(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个分割,一个分割最大18 EB(Exabytes),只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁碟不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁碟有备份分区表来提高分区数据结构的完整性。在UEFI系统上,通常是通过ESP分区中的EFI应用程式文件启动GPT硬盘上的操作系统,而不是活动主分区上的引导程序。
注释
- ^ 对于一个操作系统而言,系统分区设为活动分区并不是必须的,这主要视引导程序而定,如果使用的引导程序是Grub4Dos,MBR中的引导代码仅仅按照分区的顺序依次探测第二阶段引导器grldr的位置,并运行第一个探测到的grldr文件。
- ^ 一个硬盘的分区个数还要受到分区大小的限制,因为硬盘是按照柱面分区的:一个分区至少要占一个柱面。但有一点需要注意,由于现在的硬盘结构已经和老式硬盘有了很大区别,其寻址结构也不再是CHS寻址,所以这里的柱面大小不同于相关软件显示的柱面大小。对于物理结构上有n个面的硬盘,其分区空间的最小值为:n ×扇区/磁道× 512字节。
- ^ 根据16字节分区表的结构:当前分区的扇区数用4个字节表示,前面各分区扇区数的总和也是4个字节,而232×512 = 2 199 023 255 552 Byte