问问自己,如果你都不知道计算机是怎么启动的,那以后怎么修电脑呢?

虽然我们程序员不是修电脑的,虽然计算机启动到操作系统启动这个部分其实对工作的意义可能不大,但就是上面说的那句话,不知道启动,总是说不过去的,所以我还是单独把它拿出来,作为我们万里长征的第一步。

那你是否想过,当你按下开机键的那一刻,电脑做了什么事情呢?是不是直接读取操作系统的代码,然后一条条往下执行,最终就启动了整个系统,然后你就可以使用了?其实整个启动过程复杂而又神秘。

回忆

让我们先来看两张图

BIOS

GRUB

你是否曾经在开机的时候见过这两个画面?没错,蓝色的这张是 BIOS,而黑色的这张则是 GRUB,为什么我要先拿这两张图出来呢?没错,其实操作系统的启动过程你需要记住这两个画面,今天你就能通过下面的学习将原有的这两幅画面串起来了。

前置知识点

首先来标记一些你需要了解的基本术语和概念,方便我们后面的描述和讨论。

ROM

ROM(read-only memory) 只读内存,开机程序就在这里面

BIOS

BIOS(Basic Input/Output System) 基本输入输出系统,如果你自己尝试重装操作系统,应该对它不陌生,因为我们需要通过它来修改启动顺序,如:指定从 U盘 启动

POST

POST(Power-On Self-Test) 硬件自检,确定是否满足运行的基本条件

MBR

MBR(Master boot record) 主引导记录,设备第一个扇区最前面的 512 字节

GRUB

GRUB(GNU GRUB) 启动引导程序,多启动规范的实现,允许用户选择启动操作系统,可以向内核传递启动参数

实模式

这个翻译着实一开始让我很难对应到英文的相关资料

实模式 (Real mode) CPU 的一种工作模式,在这种工作模式下有以下几个特点:

  • 对所需执行的指令不做任何区分,不加限制
  • 访问内存的地址是真实的
  • 只有1MB的存储器可以被寻址
  • 可以直接软件访问 BIOS 程序及周边硬件

总之,在实模式下权限非常大,想干什么就干什么,但是寻址空间小

保护模式

保护模式 (Protected Mode) CPU 的一种工作模式,有以下特点:

  • 对指令及其访问的资源进行控制
  • 寻址空间变大
  • 区分了各个特权级

总之,在保护模式下,权限收拢,对访问进行了严格控制,但是寻址空间变大

启动流程

以下的几个阶段是我个人理解的人为划分,每个人有不同的理解,我为了方便记忆故整理成了几个阶段

第一个阶段

首先是上电,也就是当你按下了开机键,所需要做的第一个步骤就是读取 ROM 里面是 BIOS 系统,然后就开始进行 硬件自检 POST ,然后根据你配置,或者默认的设定的启动顺序(如果你设置了从 U 盘启动,那就从 U 盘启动,如果你设置了从硬盘启动,那就走硬盘)这里我们走硬盘。

接着就将控制权转交给了这个存储设备,这样就进入了第二阶段。

第二阶段

然后加载硬盘的第一个扇区 512 字节,也就是 MBR ,然后运行启动管理器 BootLoader ,也就是我们说的 GRUB,此时控制权交给了 GRUB

之前 CPU 是以实模式的工作模式运行的,但对于内核来说 1M 的空间肯定不够用,再者,后面的运行也涉及到安全问题,故需要权限收紧。此时 CPU 的工作模式从 实模式 切换到了 保护模式

接下来用户可以通过 GRUB 来选择需要启动的操作系统,这里我们选择 Linux,至此就进入了第三阶段。

第三阶段

最终我们的操作系统从 GRUB 手中接过了权力,内核被加载入内存,开始运行我们的操作系统。操作系统启动方法就是 start_kernel (就如同我们写代码时的 main 方法一样),首先运行的就是我们的 0 号进程 ,并且初始化各种所需环境(rootfs、调度模块等),最后从内核态切换到用户态,并且 fock 出了 1 号进程 init ,有了它,就能创建接下来系统中各种各样其他的进程了。

对于内核态和用户态的概念我们后面还会详细说到,这里可以简单理解内核态就是权限更高,专门用来执行一些系统命令,而用户态则是我们应用程序常常运行的地方

思考

为什么需要 GRUB ?

其实我一开始也不明白为什么需要有 GRUB 这个启动器,总感觉它好像没干啥事,就不能直接跳过这个,直接让 BIOS 直接启动内核吗?

于是在我翻找了一些资料后发现:GRUB 自有它的用处,参考链接我放在最后。

其实 GRUB 它是一个很重要的引导者:

  1. 引导者可以让你去引导不同的内核进行启动
  2. 引导者可以根据不同的内核传递不同的启动参数

说的再白话一点,当你有多个操作系统的时候,GRUB 可以让你选择启动 Windows 还是 Linux。

为什么要切换?

启动过程其中我特别提到了 CPU 工作模式的切换,并且还有 内核态 和 用户态 的切换,这两个切换还是很重要的。

这两个切换主要就是权限的问题,权限从大到小,慢慢不断收缩。所以权限在操作系统的学习过程中也是重要一环,权限的控制对于很多时候能避免问题。

总结

操作系统最简单的启动过程就是如下面这张图样子
process

我最喜欢的就是下面这张图,整个详细的过程就看它来理解
boot

当我们知道了操作系统是如何启动的时候,其实对于之前的我来说,最重要的一点就是明白了之前我操作系统重装的时候到底在装些什么东西,蓝色的界面到底是什么,启动之后黑色的界面又是什么。不过这毕竟是万里长征的第一步,后面对于操作系统其他的内容才是更难的路。

延伸

当然计算机发展了那么多年,启动也改了很多个版本,除了我们今天所描述的 BIOS 走 GRUB 启动,当然还有别的,如 UEFI;同样的,以上我们是通过硬盘这样的存储介质来引导启动的,还能通过网络引导;最后 GRUB 里面其实做了很多事情,并且分了多个阶段,这些阶段分别又做了什么事情呢?

所以,感兴趣的你可以继续挖掘下去。

参考链接