谢邀。资深 BIOS 工程师是最合适回答这个问题。先说结论,重启下去和重启后再回来都需要 CPU 以外的硬件提供帮助,并不是 CPU 单独可以控制,更不是操作系统能够单独完成。简单来说有时候 reset 你看到似乎断电了一下,CPU 风扇不转了,一会又开始转动,这个是 full reset,整个系统并没有断电。而这时控制整个 full reset 下去又上来的是 PMC,并不是 CPU。
我们日常使用电脑中不可避免的会重启(reset,reboot)。围绕着它,有些很有趣的问题。有的小伙伴就好奇为什么重启后 CPU 都不运行代码了,它是怎么又重新开始的,不是说好 CPU 掌控一切吗,在这个短暂的空挡,发生了什么。还有同学觉得重启就是关机再开机。
今天我们就来用户感受、软件接口和硬件来看看 reset 的原理,以及了解一下,它和关机再开机有哪些相似和不同。然后我们再来看看重启回来发生了什么。
操作系统
对于用 Window 8 以前版本的用户来说,重启和关机再开机感受没有什么不同,过后都是一片白茫茫大地真干净。Windows 8/10 启用了快速启动,从而两者产生了明显不同,详见:
老狼:Windows 快速启动背后的功臣:休眠
简单总结一下:关机再开机,会利用休眠功能(hibernate)直接进入到一个预存储的登陆画面,加速启动,但环境并不干净;而重启动则不变,从 0 开始一个个加载驱动,相对更加干净,也更慢。
操作系统当然是能够区分重启和关机再开机的,那么主板和 CPU 这么多种,它是怎么知道如何重新启动的呢?是通过 ACPI,参见:
老狼:ACPI 与 UEFI
ACPI 的 Fixed ACPI Description Table (FADT)表定义了如何 reset:
简单来说就是 BIOS 要通过 FADT 来告诉操作系统,向哪个寄存器(RESET_REG)写入什么值(RESET_VALUE)会重启。操作系统记住后,在有重启的需求时照着做就好了。
Reset 的种类
如果你有观看 ACPI 的工具,你可以在 Windows 下看一下 BIOS 到底在 FADT 里面报上来什么寄存器。如果你没有,这里推荐 RWEverything(Read & Write Everything),一个台湾同胞(?)写的免费的工具,十分强大:
老狼:也许是最良心的硬件信息读取工具:RW-everything
你会看到,现在大多数使用 Intel 芯片组的电脑,都是告诉 OS,向 0xCF9 的 IO 口,写入 6。你也可以自己用工具写一下试试,你会发现电脑真的重启了,你没有保存的文件也消失了。。。。
那这个神奇的 0xCF9 IO 端口是什么东西呢?它一般是南桥或者 southcomplex 实现的逻辑,在它之前还有 0x92 和 0x66 端口,这里按下不表。CF9 的使用已经好多代了,我们在很多地方都可以找到它,我们在 Intel 的官网搜索 E3800 的 datasheet,就可以找到它的寄存器定义,如下:
简单来说,就是:
- 写入 02,光进行 CPU 的 reset,也叫 soft reset,即将 CPU 的 INIT#信号拉低 16 个 PCI clock。CPU 会重新启动,重新从 reset vector 执行程序。这时很多 CPU 的 uncore 寄存器和南桥芯片组寄存器都没有被 reset。
- 写入 06,进行 hard reset。这是最常用的 reset。它通过 assert PLTRST#信号,通知所有芯片,包括外围的网卡等等,一起 reset。过后系统的绝大多数寄存器都会被重置为缺省值,CPU 当然也会从 reset vector 开始执行程序。
- 写入 0x0E,进行 Full reset,这是最彻底的 reset。系统会经历一次 full power cycle,看起来也就是关机再开机了一次,风扇也会挺一下,再运行。系统会依次经历 S3,S4,S5 的过程,时间较长。它会在 2)的基础上重置一下需要关机才能清除的寄存器,有时候这些动作在设置某些功能时是必不可少的。
你要问还有没有更牛的 reset,其实还有一个,那就是 global reset。0xCF9 的 reset 只影响 inband 的所有器件,而 global reset 还会 reset out-of-band 的模块,譬如 ME 和 BMC 等等。Global Reset 需要置起相应标志位。
重启回来
在 CPU 重启后,是不是要立刻跳到 reset vector 开始执行 BIOS 程序了呢?还没有,有很多先导过程。
史前时代:重启时序
在重启后很多芯片组要复位,这不是简单的一个信号就可以了,需要有个先后顺序,CPLD 等等控制电路控制了这个先后顺序,让芯片能够优雅的复位。
青铜时代:神秘消失的时间
pcode、on die rom 会在这个阶段执行,TXT、boot guard 等安全保障措施也在这里运行。
城邦时代:UEFI 的四个阶段
CPU 终于开始执行 reset vector 的代码了,这就进入了我们熟悉的 UEFI 的世界。我们之前已经有很多文章都有介绍 UEFI 的各个阶段,这里简单回顾一下:
• 在 SEC 阶段,系统从复位开始运行(由主机引导处理器取回的第一指令),通过初始化处理器高速缓存(Cache)来作为临时内存使用,我们有了堆栈,从而可以执行 c 程序,然后转到 PEI 阶段。
• 在 PEI 最开始阶段,仅少量栈和堆可用,我们需要找到并使能足够我们使用的永久内存,通常是内存颗粒或内存条(DIMM),然后转入 DXE。
• DXE 阶段有了永久存储空间,真正开始负责初始化核心芯片,然后转换到 BDS 阶段。
• 核心芯片初始化完成后 BDS 阶段开始,并继续初始化引导操作系统(输入,输出和存储设备)所需的硬件。 纵观 PI 的整个阶段,BDS 对应的是“执行 UEFI 驱动程序模型”来引导 OS 这一过程。
UEFI 引导阶段步骤和驱动程序众多,经过多年发展,核心代码已经超过一百万行,俨然已经是个独立的小王国了。要理解 UEFI,必须理解 UEFI 的目的:初始化硬件,安全启动操作系统,并为操作系统提供统一的硬件抽象。所有纷繁复杂的驱动和表象后面,都在为了这一目的服务。只要抓住这条主线,再遇到其他的知识点也就会豁然开朗了。
近代和现代:引导程序和操作系统
UEFI 会在 BDS 阶段后加载操作系统引导程序,也就是 OS loader。不同的 OS 有不同的 Loader。一般用户都十分熟悉,我们这里不再赘述。
另外传统 BIOS 和 BIOS 引导方式已经被淘汰。Intel 也宣布对传统 BIOS 兼容模式(CSM)在 2020 后不再支持。网上诸多 Int13、引导扇区等内容,除非对历史有兴趣,全部可以一笑而过了。
结论
计算机重启,CPU 并不是能够独立完成的。简单的重启后面隐藏了如此丰富的内容,这是很多人想象不到的。计算机经过几十年发展,已经十分复杂,如果我们究其一个小方面,都会发现其中隐藏了十分丰富的细节,值得大家细细探究。