一.BIOS和MBR的交接仪式
当BIOS检测完内存、显卡,把硬盘等外设加载进来后,便开始在内存0X00~0X3FF处建立起数据结构、中断向量表,并且填写中断例程。完成这一系列的操作后便开始寻找硬盘(如果硬盘不止一个的话,则会通过遍历的方式一个个地找到每个硬盘),在每个能找到的硬盘的第0盘0磁道第1扇区里面,看看此扇区最后两个字节是否为0X55和0XAA。
如果找到该扇区的末尾两个字节就是0x55和0xAA,则说明这个扇区里面存放的程序为大名鼎鼎的MBR主引导目录(Master Boot Record),这里的潜台词或许你没有注意到,也就是如果第0盘0磁道第1扇区的末尾两个字节不是0x55和0xaa,那么即使有执行的指令,也不会被认定为MBR来执行:
找到MBR程序之后,BIOS便将其加载到物理地址0x7c00处,然后条状到0X7c00处,至此,BIOS完成了它全部的任务,将控制权交给MBR继续运行,BIOS又开始沉沉睡去:
在此我们先打住,如果你一口气读完以上的全部内容,或许你会有很多的疑惑:
- 为什么是第0磁盘0磁道的第1扇区?
- 为什么尾数一定要0x55和0xaa才能认定是MBR程序?
- 为什么一定要把程序放到0x7c00这个位置?
二.方便查找
我们来想象一下如果MBR程序如果不放在指定的地方,且尾数不以0x55和0xaa结尾的话,会出现什么问题?首先BIOS因为不知道MBR程序在哪里,所以它只能一个地方一个地方地去找(也就是传说中的穷举法),找也就算了,反正区域就这么大,花时间找总是能找到的,问题是BIOS也不知道MBR究竟长啥样,这你可咋找啊,就跟你想去图书馆找一本书,你不是到它在什么位置,也不知道它长啥样叫啥名字,只是听别人说过很好看推荐你看看。
这时候有位管事的人就出来发话了:哎哎哎!你可别在这里跑来跑去了,这样吧,以后咋俩就定下个规矩,我把MBR程序放在固定的位置,就放在第0磁盘的0磁道的第1扇区吧,以后你就直接去这个地方找它就行了,但是这个位置可能会有很多不是MBR的东西,你就挨个挨个问问,谁的尾数是0x55和0xaa啊,有程序回你的话。那个就是你要找的那个MBR了!
三.为什么是0x7c00?
这个问题属于历史遗留问题,得从全球第一台个人电脑,众多X86电脑的开山鼻祖——IBM 5150开始说起。
首先初代个人电脑,使用的操作系统DOS 1.0版本,该系统的最小内存估计是32KB,所以BIOS程序就按照32KB来开发的。可用空间这么小,MBR应该放到哪个位置才是适合的呢?在这里应该需要考虑三个因素:
- 首先MBR程序不能过早地被其他程序覆盖掉,原因显而易见,这程序要是还没执行就被其他程序覆盖了,那这个系统还能开得起来吗?
- 其次MBR程序也不能覆盖已经存在的数据,原因也显而易见,打开电脑发现之前保存的学习资料奇迹般丢失了,一问原来是你这个MBR在这里雀占鸠巢,不生气气吗?
- MBR本身也是一个程序,是程序就要用到栈,虽然自己本身只有512字节的大小,但是程序本身所用到的栈也是要空间的,所以分配给MBR的空间至少得大于512个字节。
所以,为了防止和别的数据抢空间,还要保持自己有足够的空间,MBR决定当个绅士站到队伍的最后一位,等别的数据都占到空间后,自己再用剩下的空间,这时候排队开始进行了:这个地址用于存放中断向量表……那个地址当作硬件地址映射……,轮到MBR的时候还剩下末尾的最后1KB字节容量,那么MBR就顺理成章地占为己有,已知32KB等于32768个字节,那么换算成十六进制则是0x8000:
减去MBR占用的1KB(1024Byte),最后得出的结果就是0x7c00:
所以,从0x7c00开始一直到末尾0x8000这1KB的地方,就是MBR的空间。
四.MBR的结构组成以及作用
了解完以上的知识后,我们再来观察下这个占据了512个字节的MBR究竟藏着啥内容:
可以看到,MBR的主体部分用446字节存储了启动引导程序,这里就能看到MBR的主要功能是存储启动引导程序GRUB,如果细心观察开机过程你就会发现有那么几秒钟会进入到GRUB页面让你选择需要进入的内核版本,根据不同的内核进入不同的系统,属于系统还没进,但即将进去的模式,下面再详细讲解。64字节储存了分区表,最后两个字节就是大名鼎鼎的0x55和0xaa。在这里插一个额外的知识,分区表一共占据64个字节,每个分区必须占据16个字节,所以每块硬盘最多只能分4个主分区。而这16个字节每个都有它重要的作用:
五. 引导程序GRUB的作用
由MBR程序读取出来的启动引导程序GRUB,其最大的作用就是加载操作系统内核,进入到下一个阶段(也就是Boot Loader内核加载器阶段),如果不知道什么是GRUB的话请看下面这张网图回忆一下:
不同的操作系统GRUB也是不一样的,比如windows和linux的GRUB页面会被互相覆盖,所以如果要安装双系统的话需要考虑系统的安装顺序,否则将出现GRUB互相覆盖的情况。
最后补充一个知识,因为每块硬盘只能存在一个MBR程序(你可以理解为0磁盘0磁道1扇区就这么一个),所以如果要安装多系统的话,需要在分区里单独划分出一个扇区,叫引导扇区,里面再安装对应的操作系统的引导程序,但BIOS 只能找到 MBR 中的启动引导程序,而找不到在分区的引导扇区里面的引导程序。所以要想完成多系统启动,需要在MBR 的引导程序(GRUB)添加调用在分区的引导扇区中的其他启动引导程序的功能(很拗口,得多看几遍)。