2. BIOS/UEFI阶段:固件初始化、硬件自检(POST)与启动设备选择

当按下电源键的瞬间,CPU处于实模式,系统控制权首先交给主板上的固件——BIOS(基本输入输出系统)或UEFI(统一可扩展固件接口)。这一阶段是硬件与操作系统之间的桥梁,负责完成最基本的硬件初始化、系统完整性校验,并最终将控制权移交给引导加载程序。

2.1 BIOS与UEFI的核心差异

BIOS(Legacy BIOS)自1980年代起主导PC启动流程,而UEFI自2010年代后逐步取代BIOS,成为现代x86/x64平台的标准固件接口。两者在架构、磁盘分区表支持、启动速度及安全性上存在本质区别。

对比维度 Legacy BIOS UEFI
运行模式 16位实模式,寻址空间1MB 32位/64位保护模式,可寻址全部内存
磁盘分区表 MBR(主引导记录),最大支持2TB磁盘 GPT(GUID分区表),支持2TB以上磁盘
启动设备选择 扫描MBR中的引导代码(446字节) 读取ESP(EFI系统分区)中的.efi引导文件
用户界面 文本菜单,键盘操作 图形化界面,支持鼠标与网络
安全特性 无内置安全校验 Secure Boot(安全启动),校验引导程序签名
启动速度 较慢,串行初始化 较快,支持并行初始化与快速启动
调试提示: 在分析启动日志时,通过 dmesg 输出中的 EFI v2.xx 或 BIOS-provided physical RAM map 字段,可以快速判断当前系统使用的是UEFI还是Legacy BIOS模式。

2.2 硬件自检(POST)流程

POST(Power-On Self-Test)是固件在加载操作系统之前执行的一系列硬件诊断程序。其核心目标是验证CPU、内存、芯片组、存储控制器等关键组件是否正常工作。若检测到致命错误,固件会通过蜂鸣声代码或屏幕错误码报告故障。

POST硬件自检核心流程 CPU初始化与微码加载 芯片组(PCH/南桥)初始化 内存检测与SPD读取 PCI/PCIe总线枚举 存储控制器(SATA/NVMe)初始化 USB/键盘/显示等外设初始化 POST失败诊断 1长2短 → 显卡故障 连续短声 → 内存故障 无蜂鸣 → CPU/主板故障 UEFI POST特点 支持并行初始化 可跳过部分检测加速 日志记录于NVRAM

2.3 启动设备选择机制

POST完成后,固件根据用户配置的启动顺序(Boot Order)扫描可用设备,寻找可引导介质。BIOS与UEFI在设备选择逻辑上存在显著差异:

2.3.1 Legacy BIOS启动设备选择

  1. 扫描启动设备列表:按顺序检查软驱、硬盘、光驱、USB设备等。
  2. 读取MBR:在设备第一个扇区(LBA 0)读取512字节的MBR,校验最后两个字节是否为 0x55AA。
  3. 执行引导代码:将MBR中的446字节引导代码加载到内存 0x7C00 处,并跳转执行。
  4. 分区表解析:引导代码读取MBR中的4个分区表项,找到标记为 活动(Active) 的分区,加载其VBR(卷引导记录)。
// MBR结构示意(512字节)
// 偏移 0x000 - 0x1BD: 引导代码(446字节)
// 偏移 0x1BE - 0x1FD: 分区表(64字节,4个分区表项,每项16字节)
// 偏移 0x1FE - 0x1FF: 引导签名(0x55AA)

2.3.2 UEFI启动设备选择

  1. 读取NVRAM中的Boot Manager变量:UEFI固件从NVRAM读取 BootOrder 和 Boot#### 变量,获取启动项列表。
  2. 扫描ESP分区:在GPT磁盘的ESP(EFI System Partition,类型GUID: C12A7328-F81F-11D2-BA4B-00A0C93EC93B)中查找 \EFI\BOOT\BOOTX64.EFI(x64平台默认路径)。
  3. Secure Boot校验:若启用Secure Boot,固件会验证.efi文件的数字签名是否在数据库(db/dbx)中。
  4. 加载并执行UEFI应用:将选中的.efi文件加载到内存,并调用 EFI_BOOT_SERVICES->LoadImage() 和 StartImage() 启动引导程序。
关键日志字段: 在Linux启动早期,通过 efibootmgr -v 命令可以查看当前UEFI启动项配置。内核日志中的 EFI: Loaded initrd from ... 表明UEFI固件已成功加载initrd镜像。

2.4 固件初始化对内核启动的影响

固件阶段完成的工作直接影响后续内核启动的硬件环境:

固件初始化项 对内核的影响 调试关注点
内存映射(E820/UEFI Memory Map) 内核通过固件提供的内存映射表了解可用物理内存范围 dmesg | grep e820 查看内存区域类型
ACPI表 提供电源管理、设备拓扑、中断路由等信息 dmesg | grep ACPI 检查表加载情况
MTRR/MSR设置 影响CPU缓存策略与性能计数器 cat /proc/mtrr 查看当前MTRR配置
PCI配置空间 固件完成PCI总线枚举与资源分配(BAR基址) lspci -vvv 查看设备配置空间
Secure Boot状态 决定内核是否允许加载未签名内核模块 mokutil --sb-state 查看状态

2.5 常见启动故障与调试方法

  • POST卡死/无显示:检查内存条接触、显卡连接、CPU供电。尝试最小化硬件配置(仅CPU+单条内存+主板)进行排除。
  • “No bootable device”错误:确认BIOS/UEFI中启动顺序正确,磁盘GPT/MBR结构未损坏。使用Live CD启动后执行 fdisk -l 检查分区表。
  • Secure Boot导致无法启动:进入UEFI设置,将Secure Boot切换为Disabled或进入Setup Mode。或在Linux下使用 mokutil --disable-validation 禁用内核模块校验。
  • UEFI启动项丢失:使用 efibootmgr -c -d /dev/sda -p 1 -L "Linux" -l \\EFI\\BOOT\\BOOTX64.EFI 重建启动项。
调试陷阱: 某些主板在UEFI模式下默认启用“快速启动”(Fast Boot),该特性会跳过部分POST检测,可能导致某些硬件(如非标准USB键盘)在固件阶段无法被识别。若遇到固件阶段输入设备失效,请先关闭Fast Boot。

2.6 从固件到引导加载程序的过渡

固件完成设备选择后,将控制权移交给引导加载程序。在Legacy BIOS系统中,CPU此时仍处于实模式,CS:IP指向 0x0000:0x7C00(MBR加载地址)。在UEFI系统中,CPU处于64位长模式,固件通过 EFI_BOOT_SERVICES.ExitBootServices() 将控制权交给引导程序,并传递系统表指针。

固件 → 引导加载程序 控制权移交 Legacy BIOS 实模式 @ 0x7C00 MBR引导代码 加载VBR → GRUB Stage1 UEFI固件 64位长模式 EFI应用 (.efi) shim.efi → grubx64.efi 过渡关键点 关闭中断(CLI) 设置栈指针(SS:SP) 传递硬件参数表

理解BIOS/UEFI阶段的完整流程,是后续分析内核解压、内存初始化、设备驱动加载等环节的基础。固件阶段提供的硬件抽象层(如ACPI、UEFI Runtime Services)将贯穿整个内核生命周期,在调试电源管理、热插拔、固件更新等问题时,都需要回溯到这一阶段的配置与日志。