Linux内核启动过程总结(图文)

前些时间在学习linux内核的时候,有完整地看过linux内核启动的代码,但是可能是因为汇编语言基础不够扎实,很多地方没有理解到位,所以两个月过去了,现在回头看又觉得生疏了。不过我发现对启动引导过程的整体理解非常有利于具体启动代码的理解和阅读。所以就把《linux2.6内核标准教程中》一书中关于启动引导过程的总结摘录下来。以便在需要的时候看看。

启动过程如下图所示:

 

1、系统加电阶段1

该阶段完成了以下任务:系统加电后有BIOS进行加电自检POST,检查系统必备的引导设备是否存在,如内存、磁盘等关键硬件设备;然后读取CMOS中的引导设备信息,从引导设备中读取第一个扇区,该扇区包含着引导程序;在BIOS将引导设备第一个扇区的引导程序装入内存后,由引导程序包操作系统的核心装载到系统内存中。其中引导程序可以是一个很简单,只占一个扇区512字节,也可以很复杂如GRUB。2.6.x系列内核只支持GRUB、LILO等引导程序,废除了bootsect的原有引导功能,所以我们以GRUB为例来进行分析。

在引导程序GRUB被BIOS装入到内存并获得控制权之后,读取/boot/grub.conf中的引导列表选择默认要启动的内核镜像bzImage。根据bzImage中前512byte的bootsect中的setup、vmLinux.bib所占扇区的大小,以及内核是否为大内核镜像(big kernel image)将bootsect放置到物理地址0x00090000,setup放到物理地址0x00090020,如果是大内核将vmLinux.bin放置到0x000100000,否则放置到0x00010000。在将内核搬到相应的地址后,引导程序跳到物理地址0x00090020,即setup所在的物理地址,开始执行setup代码。

2、阶段1——阶段2

该阶段有文件setup.S生成的代码块进行系统设备的探测,将探测到的相关信息保存到内存地址,在系统最终初始化时有系统使用。在按顺序探测完设备后,跳转到物理地址0x000100000,开始执行由src/arch/i386/boot/compressed /head.S生成的代码块。

3、阶段2——阶段3

该阶段执行由 src/arch/i386/boot/compressed/head.S生成的代码块,该汇编代码为调用C语言函数设置相应的参数及栈指针后调用C函数decompress_kernel对压缩的内核进行解压缩,该函数按需要将解压缩的内核片段放置到两个不同的物理内存区域中,然后将head.S中名称为move。负责搬移的代码段移动到物理地址0x00010000处,然后跳转到该物理地址,执行代码。

4、阶段3——阶段4

该阶段执行复制到物理地址0x00010000的搬移代码,该部分的搬移代码将位于两个物理区域的解压缩内核代码片段移动到0x00100000,此时物理地址0x00100000处包含解压后的内核镜像。

5、阶段4——阶段5

该阶段搬移代码执行完毕后,执行紧随其后的跳转指令,跳转到物理地址0x00100000。执行位于src/arch/i386/kernel/head.S中的startup_32代码段,开始进行系统核心的初始化过程。

6、阶段5——系统完全启动

该阶段进行系统核心初始化,初始化过程由系统初始化进程init_task完成(也叫0号进程、idle进程)。该进程完成了系统内存管理子系统、进程管理子系统、中断异常子系统、时间度量子系统等的初始化工作。最后该进程通过kernel_thread()创建了一个名为init的内核线程,然后将0号进程调度器schedule(),释放了处理器的使用权,成为了系统的空闲(idle)进程。

在内核线程init获得处理器后,首先完成对称多处理器系统中应用处理器的初始化(对称多处理器系统中,负责系统引导的处理器称为引导处理器BootStrap Processor,其他处理器称为应用处理器Application Process);然后挂载系统的根文件系统,完成系统总线网络协议栈等的初始化;最后通过系统调用execve()开始执行用户态程序/sbin/init,此时内核线程init转换成了用户进程。

该用户态进程是系统中所有进程(除0号进程外)的祖先,它首先读取系统的配置文件/etc/inittab,根据该配置文件完成系统的最终初始化。在RHEL5系统下,这些初始化包括:执行脚本文件/etc/rc.d/rc.sysinit完成系统环境的初始化,包括过去网络参数,挂载进程文件系统proc(全称为process file system),内核2.6引入的用于描述系统设备层次结构的文件系统sys,挂载每个具体设备的驱动程序,设置系统时间和主机名。在需要对根文件系统进行检测时调用fcsk检查文件系统的一致性;根据文件/etc/inittab中指定的运行级别运行相应级别的启动脚本,这些脚本通常负责控制一个后台服务进程运行,每个运行级别的启动脚本位于/etc/rc.d/rc<运行级别号>.d目录中,如运行级别为3的启动脚本位于/etc/rc.d/rc3.d中;最后为系统终端启动一个getty进程,等待用户登录。(在RHEL5系统中,为每个虚拟终端启动一个mingetty进程,mingetty是getty的变体,专门针对虚拟终端进行了优化。)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值