Linux开机启动过程

时间:2022-03-12 15:56:39

使用电脑这么长时间了,很多人可能跟我一样都不太清楚电脑是怎样启动的,所谓的电脑原本只是一堆破铜烂铁废塑料,接通电源之后,竟拥有强大的计算能力的,为我们提供服务。我们所需要做的仅仅是按下开机按钮,然后等待开机完成即可,我们来试着探究一下电脑开机背后的故事。

一、 整体流程

总体来说,计算机的开机过程是按照如下的程序循序渐进的:

Created with Raphaël 2.1.0 按下开机按钮 开机 按下开机按钮 BIOS加电自检 MBR 加载引导程序 加载内核 初始化init 登录 提供服务 关机 End 关机

从上面的简易流程图可以看出,对于我们用户透明的开机过程竟然经历了这么多的步骤。
下面我们针对其中的每一个进行详细讲解。

二、过程分解

1. BIOS加电自检

当我们打开电源的时候,电脑会自动从主板的BIOS(Basic Input/Output System)中读取其中所存储的程序,这里的代码是专门针对当前计算机的主板的,当主板厂商对外销售主板的时候,这些代码就已经存在里面了。这里的程序会知道一些直接连接在主板上的硬件,比如硬盘,键盘,网卡等等。所谓的加电自检主要是BIOS检查这些硬件设备的工作状态是否正常。

自检完成后,BIOS会根据你设定的开机启动顺序,按次序找到可以正确引导的选项。现在大部分BIOS允许我们从多种设备中来启动电脑,比如硬盘,光盘,U盘等。假设当前的引导选项顺序为硬盘->可移动设备->U盘 ,那么当第一个选项硬盘可以被正确引导时,后续的两个选项将忽略,除非排在前面的引导选项都无法正常引导,才会考虑当前的引导选项。这也就是为什么当我们选择用U盘装系统的时候,需要先把引导选项可移动设备移到最前面的原因了。

2. MBR

加电自检完成之后,BIOS 找到一个可以成功引导的选项,比如我们成功的找到了一个引导选项:硬盘,那么电脑会从硬盘的前512 byte的存储空间中读取数据。这里的512 byte就是我们所说的主引导记录MBR(Master Boot Record)。 MBR会告诉电脑从当前硬盘的哪一个分区来装载引导程序(boot loader). Boot loader存储有操作系统相关的信息,比如系统的名称,操作系统的内核所在的位置等等。目前常用的boot loader有GRUB 和 LILO。

3. 加载内核

从上面分析可以看出,MBR是用来找到并加载boot loader的,而boot loader的主要功能则是用来加载操作系统内核(kernel)的。内核实际上是一个用来操作计算机的程序,主要的任务就是管理计算机的硬件资源,充当软件和硬件的接口,同时提供其他的管理功能:比如文件系统,网络管理等。用户的应用程序是不能直接操作硬件的,所有的操作必须通过中断传递给内核,由内核传达给硬件。不同的操作系统有不同的内核,比如典型的操作系统window 和 GNU/Linux 它们有着各自的内核。(对于GNU/Linux 的操作系统,大家可能都有耳闻,但是要是说到GNU/Linux内核之父,想必很多人都不知道,因为这个人实在太低调了,他就是影响全球的Linus Torvalds)。

实际上,我们的硬盘通常是被划分成多个分区的,因此我们可以在多个分区上都安装boot loader,每个boot loader可以加载对应的不同操作系统,在读取MBR的时候,选择我们想要启动的引导加载程序即可,这就是我们常说的多操作系统的原理。

比如我们当前加载的GNU/Linux 内核,那么Linux内核就开始工作了。内核首先会在内存中预留自身运行所需要的内存空间,然后通过驱动程序去检测计算机的硬件,检测完成后,内核就知道了有哪些硬盘可以使用。

4. 初始化init

内核加载完成之后,内核会启动一个init进程,这个进程就是被称为“天字一号”的1号进程。接下来的初始化工作都是借给init来管理的。 init 会运行一系列的初始化脚本,完成计算机的设置和服务的准备工作,比如设置计算机的名称,设置网络,挂载硬盘等等以及一些开机自启动的服务。

5. 登录

初始化完成之后,就会出现我们期待已久的欢迎标语和登录提示符了,如果系统中有一个合法的用户比如jacknichao,那么我们可以输入用户名jacknichao 然后操作系统会提示输入密码,待我们输入了正确的密码之后,就成功的进入了系统,取得了与操作系统内核交互的接口,称之为shell,后面根据我们的权限便可以访问操作系统提供给我们的合法资源了。

三、总结

通过前文的分析,我们发现开机启动的过程也是比较复杂的,尽管对于我们普通用户而言不需要知道这些详细的过程,但是了解其背后的操作流程还是挺有意思的不是嘛!同时,清楚了这些过程之后,对我们以后重装操作系统,修复一些开机过程中的错误问题也是非常有裨益的。
(ps:本人能力有限,如有描述错误请各位看官批评指正,感激不尽☺)