固件(Firmware)
-
加电与 CPU 初始化:
- 当你按下电源按钮,电源单元 (PSU) 开始向主板上的各个组件供电。
- CPU(中央处理器)在接收到稳定的电源和特定的复位信号后,会进行内部初始化。最关键的一步是:CPU 被硬性设计为总是从一个预先定义的、固定的内存地址开始读取并执行第一条指令。
- 对于传统的 x86 架构 BIOS 系统,这个地址通常是物理内存地址
0xFFFFFFF0
(靠近 4GB 内存地址空间的顶端,但在 CPU 的初始实模式下会被映射到 1MB 以下的某个位置,指向 BIOS ROM)。 - 对于现代的 UEFI 系统,初始化的过程更复杂,但最终也会跳转到一个预设的入口点来执行固件代码。
-
固件代码的存储:
-
这个“预先定义的地址”指向的并不是我们通常说的内存条 (RAM),因为 RAM 在刚加电时是空的。这个地址实际上指向主板上的一个非易失性存储芯片(Non-Volatile Memory),通常是 Flash ROM(现在常用 SPI Flash 芯片)。
- 这个芯片里预先烧录了固件程序(BIOS 或 UEFI 的核心代码)。“非易失性”意味着即使断电,里面的代码也不会丢失。
-
固件代码开始执行 (POST 阶段):
-
CPU 从那个固定地址开始,逐条执行存储在固件芯片中的指令。
- 固件首先执行的是POST (Power-On Self-Test) 程序。这是一个硬件自检和初始化的过程,包括:
- 检查 CPU 本身是否基本正常。
- 初始化并检测内存 (RAM),确定可用内存大小。
- 初始化主板芯片组、总线(如 PCIe)。
- 检测并初始化关键的基础设备,如显卡(以便能显示信息)、键盘(以便能接收输入)。
- 通过蜂鸣声(Beep Codes)或屏幕显示输出自检状态和错误信息。
-
查找并加载引导设备:
-
当 POST 成功完成,基本的硬件被初始化后,固件的下一个主要任务是找到一个可引导的存储设备(Boot Device)来加载操作系统的引导程序(Bootloader)。
- 固件会按照在设置界面(BIOS/UEFI Setup Utility)中预先配置好的引导顺序(Boot Order),依次检查硬盘、SSD、U盘、光驱、网络等设备。
-
加载引导程序 (根据固件类型不同):
-
对于传统 BIOS 系统:
- 它会读取所选引导设备的第一个扇区(512 字节),这个扇区被称为主引导记录 (MBR - Master Boot Record)。
- BIOS 会检查这个扇区的最后两个字节是否为
0x55AA
(所谓的“魔数”或“引导签名”)。 - 如果签名正确,BIOS 就认为这个设备是可引导的,并将这 512 字节的 MBR 内容复制到内存中的一个固定地址
0x7C00
。 -
然后,BIOS 跳转到
0x7C00
这个地址,将控制权交给 MBR 中的引导加载程序代码。BIOS 的主要引导任务到此结束。- 对于现代 UEFI 系统:
-
UEFI 不会去读取 MBR(除非开启了兼容模式 CSM)。它会查找磁盘上一个特殊类型的分区,称为 EFI 系统分区 (ESP - EFI System Partition),这个分区通常使用 FAT32 文件系统格式化。
- UEFI 会在 ESP 分区中按照预定义的路径(如
\EFI\BOOT\BOOTX64.EFI
作为默认/可移动介质路径)或根据存储在 NVRAM(非易失性 RAM)中的引导变量指定的路径,查找.efi
格式的可执行引导程序文件。 - 找到合适的
.efi
文件后,UEFI 会将其加载到内存(地址由 UEFI 决定,不再是固定的0x7C00
)。 - 然后,UEFI 执行这个
.efi
文件,将控制权交给这个 UEFI 引导程序(如 Windows Boot Manager, GRUB2, systemd-boot 等)。UEFI 本身还会提供一系列运行时服务供引导程序和操作系统使用。 - 控制权移交:
-
一旦固件(BIOS 或 UEFI)将控制权交给从存储设备加载到内存中的引导程序(MBR 代码或
.efi
文件),固件的主要启动任务就完成了。接下来的工作——加载操作系统的内核、驱动程序和启动系统服务——就由这个引导程序负责了。
总结来说,固件的启动运行过程是:加电 -> CPU 跳转到固件存储芯片的预设地址 -> 执行固件代码进行硬件自检和初始化 (POST) -> 根据引导顺序查找可引导设备 -> 加载该设备的引导程序(MBR 或 EFI 文件)到内存 -> 跳转执行该引导程序,并将控制权移交出去。v