> 文章列表 > linux系统启动过程与0号和1号进程

linux系统启动过程与0号和1号进程

linux系统启动过程与0号和1号进程

讲到linux 0号进程和1号进程就涉及到linux 系统的启动,我们就从linux启动过程开始。

1、linux 启动整体过程

  • 当系统第一次启动或重启的时候,处理器将执行一个已知地方的代码。对应个人电脑,这个地方是存在主板上内存内的BIOS

  • 当一个启动设备被发现,第一阶段引导程序被加载到RAM并执行。这一部分引导程序位于512字节的MBR镜像(MBR后面会讲到),他的作用是去加载第二阶段引导程序。

  • 当第二阶段引导程序被加载进RAM并执行,启动界面将被显示,并且Linux和可选的初始磁盘(临时文件系统)被加载进内存。当镜像被加载以后,控制权从第二阶段引导程序传递到内核镜像。

  • 内核镜像自解压和初始化。在这一步,第二阶段引导程序将检查系统硬件,枚举硬件设备,挂载主设备,加载必须的内核模块。

  • 当这些完成时,用户空间的第一个程序(init)开始执行,这样就开始顶层系统初始化开始了。

在这里插入图片描述

上面这些就仿佛是Linux启动过程的一个外壳,接下来我们开始更深层次的探索启动进程的细节。

2、系统启动

首先BIOS组成是:

  • 上电自检代码
  • 运行服务

Linux从0xffff0地址的BIOS开始启动,第一步是上电自检,上电自检的工作是检查硬件,第二步是枚举和初始化本地设备。

上电自检后,上电自检代码就从内存中被清除了,运行服务被保留并且对目标操作系统仍然有效。

要引导一个操作系统,BIOS运行时会按照CMOS的设置定义的顺序来搜索处于活动状态并且可以引导的设备(可以是软盘,CD-ROM,硬盘的分区,网络上的设备或者U盘)。

Linux一般从MBR包含初级引导程序的硬盘启动。MBR是一个512字节的扇区,位于硬盘的第一扇区(0道0柱1扇区)。在MBR被加载到RAM中后,由BIOS去控制它。

3、第一阶段引导程序

初级引导程序位于512字节的MBR镜像。
MBR镜像由一个小型分区表和代码组成。

前446字节是初级引导程序代码,包括执行代码和错误信息。

接下来的64字节是一个分区表,包含4个16字节的分区记录。

MBR最后的两字节定义了一个magic数字(0xaa55)。这个magic数字用来校验检查MBR。

在这里插入图片描述

初级引导程序主要就是找到并且加载第二阶段引导程序。其通过分区表寻找一个活动的分区。在找到一个活动的分区表后,其将扫描剩余的分区确定它们不是活动的。当这些被确定后,活动分区的启动启动记录将从设备加载到RAM并且执行。

4、第二阶段引导程序

第二阶段引导程序其实叫着内核引导程序更加合适。因为其任务就是加载Linux内核和可选的初始磁盘。

随着第二阶段被加载,CRUB会根据需求显示一个可用的内核列表(定义在/etc/grub.con,以及/etc/grub/menu.lst/etc/grub.conf的软连接)。你可以选中一个内核,并且可以用附加的内核参数改进它。

第二阶段引导程序被加载进内存后,将查询文件系统,加载默认内核镜像和initrd镜像到内存。当所有镜像准备好后,将从第二阶段跳转到内核镜像。

5、内核阶段

随着内核镜像加载到内存并且从第二阶段引导程序获得控制权,内核阶段开始了。内核镜像不是一个可以执行的内核,而是一个被压缩的内核镜像。

在内核镜像的头部有一个小型程序routine,其做少量的硬件设置,然后自解压内核镜像并放到高端内存。然后routine将调用内核开始内核启动。

6 init进程

init进程就是我们常说的1号进程。

系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型。整个linux系统的所有进程也是一个树形结构。树根是系统自动构造的,即在内核态下执行的0号进程,它是所有进程的祖先。由0号进程创建1号进程(内核态),1号负责执行内核的部分初始化工作及进行系统配置,并创建若干个用于高速缓存和虚拟主存管理的内核线程。随后,1号进程调用execve()运行可执行程序init,并演变成用户态1号进程, 即init进程。它按照配置文件/etc/initab的要求,完成系统启动工作,创建编号为1号、2号…的若干终端注册进程getty。

每个getty进程设置其进程组标识号,并监视配置到系统终端的接口线路。当检测到来自终端的连接信号时,getty进程将通过函数execve()执行 注册程序login,此时用户就可输入注册名和密码进入登录过程,如果成功,由login程序再通过函数execve()执行shell,该shell进程 接收getty进程的pid,取代原来的getty进程。再由shell直接或间接地产生其他进程。

上述过程可描述为:0号进程->1号内核进程->1号用户进程(init进程)->getty进程->shell进程,如下图:

在这里插入图片描述

参考文档

1、https://www.likecs.com/show-205059185.html

2、https://www.cnblogs.com/wanghetao/archive/2012/03/29/2422723.html