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、内存、芯片组、存储控制器等关键组件是否正常工作。若检测到致命错误,固件会通过蜂鸣声代码或屏幕错误码报告故障。
2.3 启动设备选择机制
POST完成后,固件根据用户配置的启动顺序(Boot Order)扫描可用设备,寻找可引导介质。BIOS与UEFI在设备选择逻辑上存在显著差异:
2.3.1 Legacy BIOS启动设备选择
- 扫描启动设备列表:按顺序检查软驱、硬盘、光驱、USB设备等。
- 读取MBR:在设备第一个扇区(LBA 0)读取512字节的MBR,校验最后两个字节是否为
0x55AA。 - 执行引导代码:将MBR中的446字节引导代码加载到内存
0x7C00处,并跳转执行。 - 分区表解析:引导代码读取MBR中的4个分区表项,找到标记为 活动(Active) 的分区,加载其VBR(卷引导记录)。
// MBR结构示意(512字节)
// 偏移 0x000 - 0x1BD: 引导代码(446字节)
// 偏移 0x1BE - 0x1FD: 分区表(64字节,4个分区表项,每项16字节)
// 偏移 0x1FE - 0x1FF: 引导签名(0x55AA)
2.3.2 UEFI启动设备选择
- 读取NVRAM中的Boot Manager变量:UEFI固件从NVRAM读取
BootOrder和Boot####变量,获取启动项列表。 - 扫描ESP分区:在GPT磁盘的ESP(EFI System Partition,类型GUID:
C12A7328-F81F-11D2-BA4B-00A0C93EC93B)中查找\EFI\BOOT\BOOTX64.EFI(x64平台默认路径)。 - Secure Boot校验:若启用Secure Boot,固件会验证.efi文件的数字签名是否在数据库(db/dbx)中。
- 加载并执行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() 将控制权交给引导程序,并传递系统表指针。
理解BIOS/UEFI阶段的完整流程,是后续分析内核解压、内存初始化、设备驱动加载等环节的基础。固件阶段提供的硬件抽象层(如ACPI、UEFI Runtime Services)将贯穿整个内核生命周期,在调试电源管理、热插拔、固件更新等问题时,都需要回溯到这一阶段的配置与日志。