1、BIOS启动
BIOS:Basic Input /Output System,存储在ROM芯片。其中包括系统设置、终端服务程序、开机上电自检等。
1)开机上电自检(POST):Power-on self test,检测外围设备如(CPU、内存、显卡、键盘鼠标等)是否正常
2)查找启动装置如:光驱、软驱、硬盘、U盘等。
3)读取第一个装置中的MBR,然后运行里面的代码。
2、MBR加载
MBR:主引导记录(Master Boot Record)的缩写。存储位置固定,它处于硬盘的0柱面、0磁头、1扇区。
MBR总共占用512字节,它由三个部分组成:主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition table)、结束标志(55AA),当使用grub时MBR(512字节)处存储的即为为grub引导程序的stage1,所以加载MBR即加载grub的stage1程序(此为安装grub引导程序时由grub设置,其它引导程序类似)。
1)主引导程序(Bootloader):Lilo、grub、syslinux、U-boot。目前Linux发行版主要使用的是grub。
2)硬盘分区表DPT(Disk Partition table):每个分区是16个字节,最多有4个分区。
分区表的具体含义如下:
字节 含义 值
00 分区是否可引导。 0,不可引导。80,可引导
01-03 分区开始的CHS值(Head,Sector,Cylinder,Sector的高 位是Cylinder的第9,10位)
04 分区类型 7,NTFS,C, FAT32,5,F 扩展分区等等
05-07 分区结束的CHS值(Head,Sector,Cylinder,Sector的高 位是Cylinder的第9,10位)
08-11 LBA方式下,相对的起始扇区号
12-15 该分区拥有的扇区数量 (little endion)
3、Grub引导过程:
Grub包含3部分
1)stage1(上文提到过,存储在MBR中):
A)MBR中存储的是stage1判断依据:stage1文件的大小也是512字节一个扇区那么大。 我们可以比较下MBR和/boot/grub/stage1文件的内容,获取MBR方法比较简单,dd就可以了,如下:
dd if=/dev/sda of=mbr_0_512 bs=512 count=1
这样,我们就获得了磁盘的0柱面,0磁道 1扇区的内容,即MBR,存放在了mbr_0_512文件中,比较stage1文件,其实这部分code部分是一样的,结论是/boot/grub/stage1文件和主引导记录MBR的code部分是相同的。事实上这份代码是从grub源代码的stage1/stage1.S汇编出来的。stage1.S是grub的第一个文件编译后产生的代码,正好是512字节,放入1个扇区,即MBR中存放的是stage1。
B)stage1作用:stage1这汇编出来的512个字节代码的作用是将0柱面、0磁道、2扇区的512字节copy到0x8000处,这里的另一个512字节代码,是来自源码目录下 stage2/start.S 文件的,而start.S 的作用是作为 stage1.5或者 stage2(编译 grub 时指定)的总入口,它才是 stage1.5或者 stage2的真正加载器。总结起来就是 stage1加载 start(2扇区的512字节),然后将执行权交给 start,由start 来加载 stage1.5或者stage2。
stage1.S被放在0面0道的第1扇区,start.S被放在0面0道的第2扇区,而与boot分区相关的文件系统的xxfs_stage1_5被放在0面0道第3扇区开始的扇区里,其占据的扇区数目与该stage1_5文件的大小有关。而其余的stage1_5以及stage2都作为文件被存放在boot分区里。
2)stage1_5: 识别文件系统和加载stage2。
stage1_5.c:通过文件系统读取stage2,将其加载到0x8000,然后跳转到0x8200的地方开始stage2的代码执行(在此之前没有识别文件系统的能力,所以只能通过固定扇区加载程序,到此stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行)。
3)stage2: 解析grub.conf,显示启动菜单,提供人机交互接口,加载kernel,执行initrd初始化系统等。Initrd->/sbin/init(解析/etc/inittab文件)->rc.init->rc.local。

至此linux系统启动全部完成,MBR分区硬盘分区表DPT(Disk Partition table)、grub.conf、inittab在其它文章介绍。
下面这段话是我从别处粘贴过来的,有兴趣可以研究一下。
因为BIOS很小,功能有限,为了完成加载操作系统的功能,就产生了mbr; bios检测到一个硬盘后,将硬盘的0柱面、0磁头、1扇区的内容经过简单判断后, 至内存中的指定位置,然后跳转至这个位置,开始从这个位置运行; MBR,全称为Master Boot Record,即硬盘的主引导记录。 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。 硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有 多少以及每一分区的大小都记在其中。第三部分是magic number,占2个字节,固定为55AA。 !!!!!!!!!!!!!!!!!!!!! 一般,会将mbr功能的引导代码与mbr扇区混淆; 其实,grub是直接写进mbr硬盘的主引导记录中的,计算机BIOS 在启动时,按照预定的方式,将mbr内的代码加载至内存指定位置, 然后跳转至那里,mbr的代码就开始运行了! 如果将grub写入mbr,bios就引导grub; 将winxp的引导代码写入mbr,bios就引导ntldr; 将dos的引导代码写入mbr,bios就引导dos; 总之,mbr是用来存放,由bios加载、运行的一小段代码; 代码的功能,由他们自己实现(如,在引导dos之前,先运行一个病毒, 这就是引导型病毒); dos下执行grub.exe,其实,就是由dos执行grub.exe来完成bios加载引导代码的功能, 实现引导的; 简单地说,grub.exe 是dos下的可执行程序,由dos运行; grub是引导代码,由bios加载至内存(指定位置)开始执行; 他们最终实现的功能是一样的(都是将引导代码加载至内存指定位置,并运行)。 另外,mbr是独立于操作系统的,地位与分区表同级,所以,格式化任何分区内都影响不到他, 包括ghost备份,还原。
原文:https://www.cnblogs.com/wangliangblog/p/10458109.html