电脑刚通电时,CPU 在做什么?从第一条指令讲起
CPU 不是等操作系统来叫醒它:在 x86 台式机上,电源稳定、复位解除后,处理器从约定的起点开始执行主板固件,一步步把机器准备好。
前一篇讲到微处理器和早期个人电脑。今天回到那个熟悉的问题:按下台式电脑的电源键时,CPU 到底在忙什么?它不会一醒来就看见 Windows、Linux 或桌面;那些系统还没有运行。它先要从一条非常短的起跑线出发,执行一段早于操作系统的软件。
先分清 CPU、固件和操作系统
CPU 是负责执行指令、进行计算和控制的硬件。主板上的固件(常见是 BIOS 或 UEFI 实现)是一组开机早期就能找到的程序。操作系统(例如 Linux 或 Windows)则要等固件完成一部分准备后,才由启动程序加载。三者不是同一个东西,就像厨师、开店前的值班员和整家店的经营制度各有工作。
CPU 本身不懂‘这是 BIOS’‘那是硬盘’这样的名字。对 CPU 来说,最基本的任务是:从一个地址取来机器指令,按处理器规定的方式执行,再去取下一条。固件把早期要做的事写成机器指令,硬件平台则安排 CPU 能从哪里读到这些指令。
以常见 x86 台式机为例:复位后有固定起点
电脑刚接上电时,电源和主板先确认关键电压达到可工作条件。平台会让处理器保持在复位状态;条件合适后,再解除复位。此时处理器寄存器进入架构规定的初始状态,开始从一个约定的复位位置取指。不同处理器架构和平台细节不完全一样,以下说的是常见 Intel x86 个人电脑的基本图景。
在 x86 处理器手册描述的复位状态里,处理器的代码段基址和指令指针组合,使它最早取指的位置对应物理地址 0xFFFFFFF0。它离 32 位地址空间的顶部只差 16 个字节。主板平台会让这个位置能够读到固件映像中的一小段引导代码;这小段代码再跳转到固件更完整的入口。
这个地址听起来像谜语,可以先记成‘CPU 的起跑线’。处理器并不是在电脑里四处寻找一个叫 BIOS 的文件,而是硬件告诉它从指定位置开始。那里的几条指令再带它进入更完整的开机程序。现代芯片内部细节比这复杂,但这个模型很适合理解早期接力。
简化的 x86 台式电脑开机起跑电压稳定,主板解除 CPU 复位
↓
CPU 从架构规定的复位位置取第一条指令
↓
读取并执行主板固件中的早期代码
↓
固件准备内存、检查设备、选择启动项
↓
启动程序 → Linux / Windows 内核第一件大事:先有一小块能用的工作空间
刚开始时,普通内存 DRAM 还没有完整初始化。可以把 DRAM 想成一间刚盖好的仓库:货架在,但入口、地址和工作规则还没设定好,不能马上把大量程序和资料放进去。固件得先执行很早期的代码,设置内存控制器,让它与内存条沟通,然后测试与调整时序。这个过程常被称为内存初始化或训练。
在 DRAM 就绪之前,早期程序需要少量临时空间。有些 UEFI 平台会在 PEI 等早期阶段使用处理器缓存充当临时内存,再逐渐建立正式的系统内存。不同主板和固件实现会有区别;最重要的理解是:CPU 开始执行固件时,机器还没有准备好把所有硬件都当作正常工作环境来使用。
CPU 执行固件,固件逐步把电脑交给下一位
有了临时空间后,固件会逐步处理平台设置、初始化内存与部分芯片组设备,建立屏幕和输入输出服务,再检查能够启动的存储设备。UEFI 固件通常把内部工作分成早期初始化、驱动执行和启动设备选择等阶段。传统 BIOS 的内部组织不同,但也会先准备基本硬件,再寻找可启动内容。
当固件找到启动项,就会启动下一段程序。传统台式机可能读取硬盘启动记录;UEFI 通常从 EFI 系统分区启动一个 .efi 文件。启动程序随后加载 Linux 内核或 Windows 加载器。等内核接手后,CPU 还是在执行指令,只是接下来安排它工作的软件换成了操作系统。
启动过程中,CPU 不一定是唯一忙碌的部件。内存控制器、主板管理控制器、固件驱动和其他处理器核心都可能参与准备工作;现代系统的细节因厂商而异。站在初学者的角度,先抓住主线就够了:CPU 按指令前进,固件给出早期指令并准备平台,之后再把接力棒交给启动程序和操作系统。
这条起跑线为什么和 CPU 历史有关?
早期计算机已经有负责算术和控制的部件,但不一定有今天这种独立封装的 CPU。1946 年完成的 ENIAC 使用大量真空管,程序主要通过插线板和开关设置;改变任务不像今天换一个文件那么容易。1948 年,曼彻斯特 Baby 成功运行存放在内存里的程序,说明计算机可以把指令像数据一样放在记忆装置里,再逐条取出来执行。
后来晶体管取代了许多真空管,集成电路又把许多元件做进硅片,最后微处理器把处理器核心集成到单颗芯片上。CPU 的基本工作仍是执行指令,但承载它的机器从一整间房缩小到一块芯片,再被放进桌面电脑、手机和开发板。
所以开机时的 CPU 并没有神秘地‘想起’要加载操作系统。它从预先约定的地址开始,执行工程师写进固件的第一段程序;每一段程序把硬件准备得更完整,下一段才能继续。上一篇的微处理器历史解释了 CPU 怎样缩小,这篇则把它放回现实开机过程,看它怎样从第一条指令走到内核。
这篇使用的是 x86 台式机作为例子。ARM 开发板或手机常由片上系统中的 Boot ROM 起步,再经过厂商启动程序;它们也遵循‘处理器从规定入口开始执行早期代码’这条大原则,但具体地址、固件和交接方式不同。把架构共性和平台差异分开,就不容易误以为所有电脑都走完全相同的路线。