1.概述
PC上电后,CPU将进入实模式,并从地址0xFFFF0000开始执行程序代码,此地址通常为ROM-BIOS中的地址。 此时BIOS进行开机自检,并按照BIOS中设置的启动设备(通常是硬盘)进行启动,然后启动设备上安装的引导程序lilo或者grub开始引导Linux(启动设备的第一个扇区),其时Linux才真正获得启动权。Linux获得启动权后,首先进行内核的引导,主要完成磁盘引导,读取机器系统数据,实模式和保护模式的切换,加载数据段寄存器以及重置中断描述符表等。- 然后执行
init程序(即系统初始化的工作),init程序调用了rc.sysinit和rc等程序,而rc.sysinit和rc在完成系统初始化和运行服务的任务后,返回init. init启动mingetty,打开终端用户供用户登录系统,登录成功后就进入shell,此即完成从开机到登陆的整个启动过程。
启动流程示意图:
graph TD
PC开机,CPU进入实模式--在ROM-BIOS:0xFFFF0000处开始执行代码-->BIOS开机自检-->安装的lilo\grub引导Linux获取启动权-->内核引导--完成磁盘引导,读取机器数据,实模式和保护模式切换等,然后返回init-->再执行init调用rc.sysinit,rc等程序-->启动mingetty,打开终端登录login--进入shell-->完成开机
2.内核引导阶段
-
在
grub或lilo等引导程序成功引导Linux系统后,Linux便从其手中接管了CPU的控制权,在启动的过程中主要用到内核源码目录的几个文件:bootsect.S、setup.S、以及compressed子目录下的head.S等。 -
Linux内核通常是经过压缩的,上面的几个重要的汇编程序,其皆在压缩内核vmlinuz中。 -
Linux提供的内核包含了众多驱动和功能,容量较大,压缩内核可以节省大量空间。 -
压缩内核在启动时可以对自身进行解包。
内核启动文件执行流:
graph LR
bootsect.S-->setup.S-->head.S-->main.c--start_kernel内核初始化-->调用init函数
3.init阶段
- 在内核加载之后,由内核执行引导的第一个进程是
init进程,此进程号始终为1(PID=1)。该进程根据其配置文件"/etc/inittab"主要完成一系列的初始化任务,此配置文件是该进程执行的唯一依据。 inittab文件除注释行外,每一行皆有其格式: id:runlevels:action:process- id:配置记录符
- 由
1~4个字符组成,对于getty或者mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
- 由
- runlevels:运行级别记录符
- action:描述系统执行特定操作
- process:设置启动进程所执行的命令
- id:配置记录符
init进程的作用是启动Linux系统服务(也就是运行在后台的守护进程)Linux系统服务包括两种:- 第一种独立运行的系统服务,其常驻内存中,开机后一直运行。
- 第二种是有
xinet设定的服务,能够同时监听多个指定端口,根据请求需求启动不同的网络服务进程,可以将其看作是一个启动服务的服务管理器。
- 参考文献:《Linux嵌入式应用程序开发标准教程(第2版)》
- 参考文献:《Linux下inittab文件详解》