按下电源键那一刻起,你电脑里已经同时发生了好多事

知乎日报 老狼 266℃ 评论

按下电源键那一刻起,你电脑里已经同时发生了好多事

图片:Public Domain

按下电源键后发生了什么?电脑是如何优雅地开机的?

老狼,UEFI固件、服务器、嵌入式产品、开源硬件从业者

一个程序是如何开始运行的呢?这个问题,一千个人有一千种回答。电脑用户说:“双击程序图标就行了啊。”;初级程序员信心满满的回答:“是从 main 函数开始执行的。”;高级程序员也许会和你聊到 c 运行时库,那里才是程序编译运行的第一条指令;而熟悉操作系统的专家却并不知道如何说起,程序加载器、重定位、堆和栈的建立、进程和线程的创建等等细节闪过脑海,哪里才是真正的源头呢?

同样问道计算机是如何启动的,也许答案就是按下电源键而已。但在那个简单到极致的动作后面却隐藏了复杂的机理。启动的开始并不仅仅是操作系统引导,亦或 BIOS 运行,甚至 CPU 在 reset vector 执行第一条指令之前,很多事情已经发生了。正如地球生命的发端并不由人类的到来而伊始,秘密隐藏在远古而不为人知的远古时代。让我们顺着时间回溯,站在一切发生的起点:“电源键按下”,通过时间的流转,梳理其中所有的硬件软件过程,来深入了解计算机的工作原理。

史前时代:上电时序

上电时序,也叫做 Power-up Sequence,是指电源时序关系。它牵扯到诸多计算机部件,在正式开始时间之旅之前,我们来介绍一下所有参与的小伙伴们。

电源

ATX 电源提供 +12V、-12V、+5V、-5V、+3V 和 +5VSB 等六种电压。也就是我们图上的两个白色的电源接入口。主板其他的不同电压是主板上的变压线路转换过来的,他们包括 +3VSB、+1.5VSB、1.8VDual、2.5VDual、3VDual、VCore、VTDDR 等等很多。

+12V 主要是给 CPU 内核供电,它可以单独给 PCIe 设备供电,包括显卡等等。+5V 应用最广,给 USB 等等外设供电。+5VSB 等各种带 SB 的电压,是提供 Stand By 的供电,即在 S3 Sleep 时提供电力,保障唤醒和刷新。

主板右边中间那个纽扣电池,它叫做 RTC 电源,永不掉电。除非电池没电并且没接任何外部电源。 RTC 用以保持机器内部时钟的运转和保证 CMOS 配置信息在断电的情况下不丢失。

时钟

电脑中的 CPU,AGP、PCI 插槽、SATA、USB 端口和 PS/2 端口等在通信速度上有很大差异,所以需要提供不同的时钟频率。由 ck410、ck505 和 iCLK 等芯片将原先散布在不同地方的晶振和分频电路整合在一起,为 CPU、SATA、PCI、USB 等等设备提供基础频率。

电源时序控制芯片 / 电路

主板对于上电的要求是很严格的,各种上电的必备 条件都要有着先后的顺序,一项条件满足后才可以转到下一步,如果其中的某一个环节出现了故障,则整个上电过程不能继续下去。谁来控制和协调整个时序过程呢?不同的主板、芯片组、代际之间都有不同的方案,在笔记本上过去经常采用 EC 的方案、台式机则很多用 SIO 或者定制芯片。现在很多电源时序控制被整合进了 ME 中,在面向嵌入式设备的 Atom 系列主板上则越来越多的引入了在手机等设备上常用的 PMIC。

时间开始

我们通过一个古老的例子来了解一下开机的整个过程:

  1. 在 G3(未接电源)情况下,RTC 电源提供 RTC_RST#和 VCC_RTC 电源给南桥。
  2. 插入电源或者电池。系统进入 G2,S5 的状态。EC 检查电源的可靠性,并发送 PM_RSMRST#通知南桥各种 SB 电压已经准备完毕。南桥复位,部分功能 SB 功能激活,进入待机状态。
  3. 用户按下电源键,时间开始。
  4. EC 收到 PWRSW#信号,通过 PM_PWRBTN#通知南桥。南桥收到 PM_PWRBTN#信号后依次拉高 SLP_S5#,SLP_S4#,SLP_S3#信号给 EC。
  5. EC 发出 PCON#给 ATX 电源。
  6. ATX 电源接到低电平的 PSON#信号后,开始工作,发出各路基本电压给主板上的各个元件。
  7. 基本电压变换的其他电压也被转换出来。
  8. 电源发出 PWROK#给 EC,EC 转交给南桥和北桥(有的话)
  9. VRM 和 CPU 通讯,根据 VID 送出 Vcore
  10. VRM 发生 VRMPWRGD#给南桥,表示核心电压 OK。
  11. 南桥发送 PLT_RST#给北桥。
  12. 南桥发送 PWRGOOD#给 CPU。
  13. 北桥在收到 PLT_RST#信号后,1 秒钟后发生 CPU_RST#,让 CPU 复位

时序图如下:

青铜时代:神秘消失的时间

在 CPU 复位后,是不是要立刻跳到 reset vector 开始执行 BIOS 程序了呢?还没有,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 后不再支持(参考资料 1)。网上诸多 Int3、引导扇区等内容,除非对历史有兴趣,全部可以一笑而过了。

结论

按下电源键,CPU 并不是第一个得到通知并立刻执行代码的。简单的开机后面隐藏了如此丰富的内容,这是很多人想象不到的。很多主板,尤其是很多服务器主板,从按下电源键到 CPU 开始执行 UEFI 固件程序,期间经历了很多隐藏的片段。这些片段可长可短,有的转瞬即逝、有的却让人等上片刻。它们究竟是什么,为什么存在,值得大家细细探究。

至于按下电源键如何关机,见专栏另一篇文章:按下电源键后发生了什么?电脑是如何关机的?

参考资料:

[1]: Intel 计划彻底封杀 Windows 7 系统:2020 年之前搞定

转载请注明:微图摘 » 按下电源键那一刻起,你电脑里已经同时发生了好多事

喜欢 (0)or分享 (0)
发表我的评论