Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

按下电源:复位与固件

复习

  • 从源代码到可执行文件:编译、汇编和链接的完整流水线
  • 编译与解释:程序变成机器指令的两条基本道路
  • 没有操作系统的程序:裸机程序在装载、设备和多程序共存上的困难

TL;DR

  • 按下电源的一瞬间,机器里还没有操作系统
  • CPU 只能从约定好的固定地址取第一条指令,这叫复位
  • 这段最先运行的软件叫固件,负责自检并找到启动设备
  • 固件把控制权交给启动设备上的引导程序,接力正式开始

正文

  按下电源键,机器“嗡”地一声亮起来。可这一刻,它其实什么都不知道——内存是空的,操作系统还没被装进去。

  那么,CPU 该从哪里开始执行?

从一个约定好的地址开始

  这是计算机启动的第一条规矩:上电之后,CPU 从一个固定的地址取第一条指令。

  这个动作叫复位(reset):把所有寄存器设成初始值,让 PC 指向那个约定地址。全世界的 CPU 和主板都遵守这个约定,不然第一行代码就无从谈起。

  那个地址里放的,是主板上一小块只读存储器中的程序。它通常被称为固件(firmware),大家更熟悉的名字是 BIOS 或 UEFI。

固件做三件事

  固件是最先醒来的软件,它大致做三件事:

  1. 自检:检查内存、显卡、键盘等基本设备是否正常(俗称 POST)
  2. 初始化:给硬件做最基本的设置
  3. 寻找启动设备:按照预设顺序,在硬盘、U 盘、光驱里找“可以启动”的那个

  它像新兵连的班长:天没亮先把大家叫起来,点名、发装备,再告诉你接下来听谁的。

找到启动设备

  光靠固件是装不下操作系统的:它容量有限,而且改动起来很麻烦。所以,固件并不亲自加载操作系统,而是去找一个启动设备

  它在设备的固定位置读取一小段代码,把控制权从自己手里交给这段代码——这就是引导程序(bootloader)。交接的方式很简单:让 PC 跳过去。

  于是,启动就成了一条接力链:

固件 → 引导程序 → 操作系统内核 → 普通程序

  每一棒都只做一件事:从下一棒该在的位置把它读进来,然后跳过去。

为什么这么绕

  你可能会问:既然操作系统在硬盘上,为什么不让 CPU 直接去硬盘执行?

  因为 CPU 只能执行内存里的指令;而且硬盘的位置、格式千差万别,CPU 并不认识。固件和引导程序,正是为了在“硬件千差万别”和“内核只认内存”之间搭一座桥。

  这又是那句话:在计算机科学里,没有什么问题是加一层解决不了的。

  固件把控制权交出去之后,引导程序要做的事情还不少:它得把真正的内核从硬盘搬进内存。下一章,我们就看这一棒怎么跑。

思考题

  固件和操作系统都“管理硬件”,它们的职责有什么不同?为什么不让固件直接把整个操作系统也一起装好?

小结

知识点

  • 复位:上电后 CPU 从固定地址开始执行
  • 固件:最先运行的软件,负责自检与寻找启动设备
  • 启动设备:存放引导程序的设备
  • 启动是一条接力的链条

参考资料

  1. Wikipedia(zh):固件:BIOS 与 UEFI
  2. Wikipedia(zh):加电自检:POST
  3. Wikipedia(zh):引导程序:bootloader

思考题答案(仅供参考)

  固件只负责“把机器唤醒、把下一棒叫出来”,做的是最基本的、与具体操作系统无关的工作;操作系统则负责运行中的资源管理、进程调度、文件系统等。固件容量小、改动不便,也不适合承担复杂而多变的管理职责。把复杂的事情交给可替换、可升级的操作系统,固件只做“引路人”,职责更清晰,也更容易更新。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪