在本文中,MBR有两种含义:一是指MBR规范中的MBR;二是指对硬盘的第一个扇区的称呼。
一、不同种类的boot sector
在硬盘已经被分区的前提下,boot sector可以分为以下3类:
- MBR:master boot record,硬盘的第一个扇区
- VBR:volume boot record,主分区和逻辑分区的第一个扇区
- EBR:extended boot record,扩展分区中保存有逻辑分区位置信息的扇区,多个EBR之间通过指针链接成一个链表,EBR可以存在于扩展分区中除了逻辑分区以外的所有的扇区中。对于EBR来说,第一个EBR处于扩展分区的第一个扇区,接下来的EBR没有“第一个扇区”的概念
二、MBR
MBR中具有两部分:分区信息(partion table)和引导代码(bootstrap code)。
现在常见的分区信息中每条分区记录有32位,那么最大支持空间是2TB。
经典的MBR规范中,它的结构如图1所示。
图1
它的partion entry结构如图2所示。
图2
由该partion entry可知,如果硬盘稍微大点,chs逻辑硬盘地址方案中的c值有可能就不能由现在分配的位数表达了。因而,在MBR规范中,直接舍弃“virtual CHS values逻辑硬盘地址方案”,而采用LBA方案。
4个partion entry可以指向主分区或者扩展分区,但是扩展分区至多一个。
三、EBR
在扩展分区中,使用EBR来定位逻辑分区,它的结构如图3所示。
图3
在其中,一般情况下,前446个字节,third entry和fourth entry中的值都为0。first entry指向属于该EBR的逻辑分区的位置;second entry指向下一个EBR的位置。
四、VBR
主分区和逻辑分区的第一个扇区被称为VBR,在VBR中可以保存在本分区安装的操作系统的引导代码。
五、开机加载流程
5.1、单操作系统
1、需加载操作系统在主分区
- 首先BIOS加载MBR
- 执行MBR中的引导代码,这时候分为两种情况,一种是引导代码直接加载操作系统;另外一种是加载活动分区中的VBR,让其加载操作系统,在后者情形下,会发生如下这些步骤:
- 读取MBR中的分区信息,确定活动分区(这里某条主分区的partion entry被标识为active)
- 加载活动主分区的VBR
- 执行VBR中的引导代码,加载操作系统
2、需加载操作系统在逻辑分区
- 首先BIOS加载MBR
- 执行MBR中的引导代码,这时候分为两种情况,一种是引导代码直接加载操作系统;另外一种是加载活动分区中的VBR,让其加载操作系统,在后者情形下,会发生如下这些步骤:
- 读取MBR中的分区信息,确定活动分区(这里扩展分区partion entry被标识为active)
- 加载扩展分区上的第一个扇区中的第一个EBR,根据这个EBR遍历EBR链接表,找到被标识为active的逻辑分区位置
- 加载活动逻辑分区的VBR
- 执行VBR中的引导代码,加载操作系统
5.2、双操作系统
- 首先BIOS加载MBR
- 执行MBR中的引导代码,给出可选择加载操作系统列表供用户选择
- 在用户选择加载某个操作系统后,MBR中的引导代码根据某个映射机制能够得到需加载操作系统所在的活动分区位置信息
- 加载活动分区的VBR
- 执行VBR中的引导代码,加载操作系统
六、MBR规范变种
现在出现了很多的MBR规范变种,主要原因有两个:
- 随着时间的推移,为了提升MBR规范所拥有的能力,对原有MBR规范进行了改进
- 不同操作系统在支持MBR规范的时候,会增加特定于自身的一些限制,这些从某个角度来看,也是MBR规范的变种
比如随着时间的推移,出现了如下形式的现代MBR结构:
又有Dos,OS/2等操作系统只支持CHS寻址方案,因而对MBR规范增加了如下的限制,这使得也产生了MBR规范的变种[5]:
- MBR所处的柱面和第一个主分区的开始柱面都为0柱面,这些操作系统直接限制第一个主分区的起始扇区是0柱面第2个磁头上的第一个扇区,这浪费了0柱面第1个磁头上除了第一个扇区以外的所有扇区(0柱面第1个磁头上的第一个扇区是MBR所在扇区)
- EBR所处的柱面和该EBR所对应的逻辑分区的开始柱面都为c柱面,这些操作系统直接限制逻辑分区的起始扇区是c柱面第2个磁头上的第一个扇区,这浪费了c柱面第1个磁头上除了第一个扇区以外的所有扇区(c柱面第1个磁头上的第一个扇区是EBR所在扇区)
参考文献
[1]https://en.wikipedia.org/wiki/Master_boot_record
[2]https://en.wikipedia.org/wiki/Volume_boot_record
[3]https://en.wikipedia.org/wiki/Extended_boot_record#ask1.1
[4]https://en.wikipedia.org/wiki/Boot_sector
[5]man cfdisk