linux启动流程

1BIOS启动

BIOSBasic Input /Output System,存储在ROM芯片。其中包括系统设置、终端服务程序、开机上电自检等。

1)开机上电自检(POST):Power-on self test,检测外围设备如(CPU、内存、显卡、键盘鼠标等)是否正常

2)查找启动装置如:光驱、软驱、硬盘、U盘等。

3)读取第一个装置中的MBR,然后运行里面的代码。

2MBR加载

MBR:主引导记录(Master Boot Record)的缩写。存储位置固定,它处于硬盘的0柱面、0磁头、1扇区。

MBR总共占用512字节,它由三个部分组成:主引导程序(Bootloader)、硬盘分区表DPTDisk Partition table)、结束标志(55AA当使用grubMBR(512字节处存储的即为为grub引导程序的stage1,所以加载MBR即加载grubstage1程序(此为安装grub引导程序时由grub设置,其它引导程序类似)。

  1主引导程序(Bootloader):LilogrubsyslinuxU-boot。目前Linux发行版主要使用的是grub

  2)硬盘分区表DPTDisk 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)

3Grub引导过程:

Grub包含3部分

1stage1(上文提到过,存储在MBR中):

AMBR中存储的是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文件和主引导记录MBRcode部分是相同的。事实上这份代码是从grub源代码的stage1/stage1.S汇编出来的。stage1.Sgrub的第一个文件编译后产生的代码,正好是512字节,放入1个扇区,即MBR中存放的是stage1

 

Bstage1作用:stage1这汇编出来的512个字节代码的作用是将0柱面、0磁道、2扇区的512字节copy0x8000处,这里的另一个512字节代码,是来自源码目录下 stage2/start.S 文件的,而start.S 的作用是作为 stage1.5或者 stage2(编译 grub 时指定)的总入口,它才是 stage1.5或者 stage2的真正加载器。总结起来就是 stage1加载 start2扇区的512字节),然后将执行权交给 start,由start 来加载 stage1.5或者stage2

2start.S: 加载stage2或 stage1.5。

stage1.S被放在0面0道的第1扇区,start.S被放在0面0道的第2扇区,整个start.S代码的作用是从LBA 扇区号2(0柱面 0磁道 3扇区) 开始拷贝若干个扇区到内存。起始扇区号,扇区个数内存目的地址都在start.S中定义了。此时两种情况:
A)start.S加载stage1.5:stage1.5它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot/grub目录下的 stage2文件,将stage2载入内存并执行。star.s将stage1_5载入到0x2200处,载入完成后调到0x2200(stage1.5前512个字节的内容同样和start.s基本相同,可使用dd if=/dev/sda of=mbr_512_1024 bs=512 skip=1 count=1读取start.s后和stage1_5比较)执行stage1_5代码。stage1_5在grub中的名称为xxfs_stage1_5,事实上,xxfs_stage1_5的前512个字节的内容和start.S对应的二进制文件基本相同,后面的部分才是操作文件系统部分。start.S加载到磁盘上的从3扇区开始的内容,就是文件系统的代码。把这些内容加载到内存后,就具备了操作启动设备上面文件的功能了。此后xxfs_stage1_5通过文件系统读取stage2(在xxfs_stage1_5中的stage1_5.c实现),将其加载到0x8000,然后跳转到0x8200(stage2前512个字节的内容同样和start.s基本相同)的地方开始stage2的代码执行。

在stage1.5之前没有识别文件系统的能力,所以只能通过固定扇区利用init 13读取磁盘,到stage1.5时有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的stage2文件,将stage2载入内存并执行

 

B)start.S加载stage2:这时stage2不是/boot/grub目录下的stage2,是在磁盘固定扇区的stage2(无文件系统,只能通过init 13读取)。这种情况下就有一个限制,因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,可能无法读取stage2(stage2大小超过寻址范围),所以引入stage1.5,由stage1.5加载文件系统后读取stage2。stage1.5一般10几k,start.s完全可访问。

 start.s加载stage1.5还是加载stage2由安装grub时确定,也可启动时通过grub命令修改。

3stage2: 解析grub.conf显示启动菜单,提供人机交互接口,加载kernel执行initrd初始化系统等。Initrd->/sbin/init(解析/etc/inittab文件)->rc.init->rc.local

 

至此linux系统启动全部完成,MBR分区硬盘分区表DPTDisk Partition table、grub.confinittab在其它文章介绍。

下面这段话是我从别处粘贴过来的,有兴趣可以研究一下。

因为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