按下电源键等待linux启动的过程中,好奇的童鞋们肯定在想“大企鹅”内部都做了什么呢?其实这设计到内核启动的流程问题,其相关过程让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统的好方法同时由于其本身复杂且底层,脑子中的脉络不是很清晰,让大家很困惑。本文就总结了其他大神的优秀博文,以自己的理解来分析一下。由于自身水平有限,难免理解有偏差,表达不全面,欢迎朋友们在评论区斧正。
言归正传,首先说明本文的环境是CentOS 6.8,内核版本为
并且为了本文结构更易理解,所以仅是介绍了最主流的过程,
基本过程:
庖丁解牛:
1.POST
BIOS的功能由两部分组成,
步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;
步骤2:步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。 BIOS的任务就完成后将系统启动的控制权移交到MBR部分的代码。
2.MBR(Master Boot Record):主引导扇区位于整个硬盘的0磁头0柱面1扇区,包括446字节的bootloader和64字节的分区表和两个字节的魔数。。其中主引导记录的作用就是检查分区表是否正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序,也就是操作系统引导扇区调入内存加以执行。
grub
stage1:stage1是直接被写入到MBR中去的,这样机器一启动检测完硬件后,就将控制权交给了GRUB的代码。也就是上图所看到的前446个字节空间中存放的是stage1的代码。BIOS将stage1载入内存中0x7c00处并跳转执行。stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。而0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口
stage1.5它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。
当stage2被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。而内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。
关于Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中
3.kernel:
自身初始化:
探测可识别到的所有硬件设备;
加载硬件驱动程序:(有可能会借助于randisk加载驱动)
以只读方式挂载根文件系统,防止内核对根文件系统有损坏
运行用户空间的第一个应用程序:/sbin/init
a.ramfs
b.
4.系统初始化
一览众山小:
来源:oschina
链接:https://my.oschina.net/u/4394252/blog/4317347