1. UEFI概述:从Legacy到现代固件的进化
大家好,我是老赵。做固件这行十几年了,今天咱们聊聊UEFI。很多刚入行的工程师觉得UEFI很神秘,其实说白了,它就是一套定义操作系统和固件之间怎么打交道的接口规范。嗯,你可以把它理解成计算机启动时的“交通规则”。
1.1 什么是UEFI?
UEFI的全称是Unified Extensible Firmware Interface,统一可扩展固件接口。它不是一段代码,而是一个标准。我习惯把它比作一个“微型操作系统”——它有驱动模型、有协议栈、甚至有自己的Shell环境。
核心要点:UEFI不是BIOS的替代品,而是BIOS的进化版。它解决了传统BIOS在容量、速度、安全性上的诸多瓶颈。
我记得2010年左右第一次接触UEFI项目时,最大的感受就是:这玩意儿比Legacy BIOS灵活太多了。传统BIOS的代码用汇编和C混写,改个功能要翻半天datasheet;UEFI用C语言,模块化设计,调试起来舒服得多。
1.2 UEFI与Legacy BIOS的区别
咱们直接上表格,对比最直观。你想想看,传统BIOS启动时那“嘟”一声,背后其实藏着不少限制。
| 对比项 | Legacy BIOS | UEFI |
|---|---|---|
| 接口模式 | 16位实模式 | 32/64位保护模式+长模式 |
| 寻址能力 | 1MB限制(实际可用640KB) | 理论支持16EB(实际受主板限制) |
| 磁盘分区 | MBR(最多4个主分区,2TB限制) | GPT(128个分区,9.4ZB限制) |
| 启动速度 | 慢(逐扇区扫描) | 快(直接加载EFI应用) |
| 驱动模型 | Option ROM(16位代码) | EFI Driver(C语言编写) |
| 安全性 | 无内置安全机制 | Secure Boot(安全启动) |
| 用户界面 | 文本菜单(蓝底白字) | 图形界面(支持鼠标、高分辨率) |
| 扩展性 | 差(依赖中断向量表) | 好(Protocol/Handle机制) |
避坑指南:我曾经遇到过一块主板,Legacy模式下死活认不出3TB硬盘。客户以为是硬盘坏了,折腾了两天。后来切到UEFI+GPT模式,一次点亮。所以,大容量磁盘必须用UEFI,这是硬门槛。
1.3 UEFI的启动流程
UEFI启动流程分七个阶段,我习惯用“SPDBTRA”来记。每个阶段都有明确的任务,就像流水线一样。下面这张图是我自己画的,你一看就明白。
1.4 各阶段深度解析
SEC阶段
这是CPU上电后执行的第一段代码。说白了,就是检查CPU是否正常、缓存能不能用。SEC阶段连内存都还没初始化,代码只能在CPU内部的Cache里跑。嗯,这里有个坑——如果CPU微码不对,机器根本起不来。
PEI阶段
PEI的核心任务就一个:把内存搞出来。没有内存,后续所有代码都跑不了。我习惯把PEI比作“先搭脚手架”。这个阶段会调用PEIM(PEI Module)来初始化内存控制器、配置SPD参数。
注意:PEI阶段如果卡住,多半是内存问题。我曾经调试过一块板子,换了三根内存条才找到兼容性最好的那根。建议你手边常备一根JEDEC标准内存条用于排除故障。
DXE阶段
DXE是UEFI最复杂的阶段。内存有了,CPU跑在保护模式下,这时候开始加载各种驱动:PCIe枚举、SATA初始化、USB控制器、网卡……所有硬件的驱动都在这个阶段加载。DXE阶段会构建一个完整的Protocol数据库,供后续阶段调用。
BDS阶段
BDS负责决定从哪个设备启动。它会扫描所有可启动设备——硬盘、U盘、光驱、PXE网络——然后按照BootOrder顺序尝试启动。如果所有设备都启动失败,就会进入UEFI Shell或者显示“No bootable device”。
TSL阶段
TSL是OS Loader启动前的最后准备。启动管理器(Boot Manager)会加载操作系统的引导程序,比如Windows的bootmgfw.efi或者Linux的grubx64.efi。这个阶段如果出问题,通常是引导文件损坏或者Secure Boot策略冲突。
RT阶段
操作系统接管后,UEFI进入Runtime模式。这时候UEFI提供一些运行时服务,比如GetVariable、SetVariable、ResetSystem等。操作系统可以通过这些服务读写固件设置。嗯,这里要注意——Runtime阶段的代码必须支持虚拟地址转换,否则OS切换页表后固件就崩了。
AL阶段
AL是收尾阶段。系统关机、休眠或者重启时,UEFI会清理资源、保存NVRAM变量、关闭硬件设备。这个阶段出问题通常表现为“关机不断电”或者“重启卡死”。
1.5 UEFI的生态与标准组织
UEFI不是某家公司闭门造车搞出来的。它由UEFI论坛(UEFI Forum)管理,成员包括Intel、AMD、Microsoft、Apple、ARM等巨头。论坛负责维护UEFI规范,目前最新版本是2.10(截至2024年)。
我个人的经验是,搞UEFI开发必须常备三份文档:
- UEFI Specification:官方规范,定义所有接口和协议
- PI Specification:平台初始化规范,定义SEC/PEI/DXE等阶段的内部接口
- ACPI Specification:高级配置与电源接口规范,和UEFI配合使用
小技巧:UEFI规范有2500多页,别从头读到尾。我建议你先读第2章(概述)和第4章(Protocol),遇到具体问题再查对应章节。另外,EDK2开源代码是最好的学习资料——边看代码边对照规范,效率最高。
UEFI生态里还有几个重要的开源项目:
- EDK2:Intel主导的UEFI参考实现,最主流的开发框架
- GRUB2:Linux世界的引导管理器,支持UEFI启动
- systemd-boot:轻量级UEFI启动管理器,很多Linux发行版在用
- UEFI Shell:固件自带的命令行环境,调试利器