ARTICLE · 1167314
学BIOS的5本书和3个必看源码文件
学BIOS的5本书和3个必看源码文件
一份经过老兵筛选的学习资源清单
刚入行那会儿,我最大的困惑不是"BIOS难不难",而是"我到底该看什么"。书一大堆,规范一大堆,源码更是海量,打开 edk2 那个目录树,几千个文件夹扑面而来,瞬间懵了。这感觉就像把你扔进一个五金店,告诉你"去把家具做出来",但没告诉你要先拿锤子还是先拿螺丝刀。
这篇我把自己踩过的坑筛一遍,给你一份"先看什么、后看什么、什么时候看"的清单。不追求全,追求有用。
📚 先立个规矩:书是地图,不是课本
新人最容易犯的错,是把规范当教科书从第一页开始啃。我可以负责任地说:没有人这么干,这么干的人最后都转行了。规范的正确用法是"字典",遇到不懂的术语和结构去查。这个观点我会在《读UEFI规范有用吗》那篇里展开,这里先给你排序。
🥇 第一本:《UEFI原理与编程》(戴正华)
如果只能推荐一本中文书,就是这本。它是我见过把"UEFI 启动流程"讲得最接地气的入门书,而且是从工程角度写的——有代码、有结构、有流程图。
这本书最好的地方是它把 PEI 和 DXE 两个阶段讲透了。很多英文资料要么太抽象,要么直接甩 spec 原文,这本书是真的一步步带你走:从 ResetVector 开始,到 SEC 找 PEI Core,到 PEI 派发 PPI,到 DXE Core 起来,到 BDS 选择启动设备。
怎么用:入门期通读一遍,重点看 PEI/DXE 章节。之后当工具书,哪个阶段卡住了回来翻对应章节。
🥈 第二本:Intel SDM(Intel® 64 and IA-32 Architectures Software Developer's Manual)
这是 Intel 的 CPU 手册,三卷还是四卷记不清了,反正厚得能当砖头。但别被吓到,你不需要全读。
BIOS 工程师真正会用到的就那几块:CPU 复位后的初始状态(reset vector 是 0xFFFFFFF0,实模式,CS 被塞了特殊 base)、IA32 系统寄存器(MSR、CR0/CR3/CR4)、中断和异常、以及 SMM(System Management Mode)那一大章。
什么时候用:当你需要知道"CPU 上电后第一条指令在哪执行"、"某个 MSR 是干什么的"、"SMI 到底是怎么进怎么出的",去查。它是权威的,比任何博客都权威。
🥉 第三本:UEFI Spec 和 PI Spec
这俩是两本,但我放一起说,因为它们的分工很明确,新人总是分不清。
- UEFI Spec
:定义的是"操作系统和固件之间的接口"——Boot Services、Runtime Services、Protocol、EFI System Table 这些。说白了,这是固件对外暴露的"服务界面"。
- PI Spec
:定义的是"固件自己内部怎么组织"——PEI、DXE、HOB、PPI、Firmware Volume 这些。这是固件的"内部装修"。
一句话记忆:UEFI Spec 管"怎么跟 OS 打交道",PI Spec 管"固件自己怎么长起来的"。做底层启动和移植,PI Spec 用得更多;做驱动和 Option ROM,UEFI Spec 用得多。
📖 第四本:Beyond BIOS(Vincent Zimmer 那本)
这本书偏"原理和思想",代码不多,但把 UEFI/PI 的设计动机讲清楚了——为什么要搞 PEI 和 DXE 两个阶段、为什么 HOB 是只读的、为什么要有 Firmware Volume 这个概念。
它解决的是"知其所以然"的问题。很多工程师代码写得溜,但被问一句"为什么 DXE 要等到内存起来才跑"就卡壳。这本书补的就是这块。
什么时候看:入行半年到一年,代码会写一点了,回来看这本书,会有豁然开朗的感觉。刚入门就看会有点飘。
📘 第五本:ACPI Spec
严格说这不是"书",是规范,但我还是把它列进来。因为笔记本 BIOS 的日常,有一大块是在跟 ACPI 打交道——电源管理、睡眠唤醒、热管理、以及各种 _SB、_WAK、_PTS 这些 method。
ACPI Spec 同样不需要通读,重点看 DSDT/SSDT 的结构、命名空间、以及常用的 Power Management 相关 method。配合 iasl 反编译一张 DSDT 来对照看,效果最好。
🔥 然后说说源码:3个必看的文件
书看完,真正让你入门的还是源码。edk2 是开源的,这是学 BIOS 最大的红利。我给你点 3 个文件,把这 3 个看懂,你就比 80% 的入门者强了。
1️⃣ MdeModulePkg/Core/Pei/PeiMain.c
这是 PEI 阶段的入口,PEI Core 的主函数就在这。看它你就明白:PEI Core 是怎么被 SEC 交棒过来的、PeiServices 是怎么初始化的、PPI 数据库(PpiList)是怎么建立和查询的、PeiDispatcher 是怎么被调起来去跑那些 PEIM 的。
SecCoreData 里带着从 SEC 交接过来的信息,其中 StackBase 和 StackSize 特别值得看——因为 PEI 阶段可能还在用临时栈(cache-as-RAM 或者临时内存),理解栈从哪来,是理解 PEI 的关键。
2️⃣ MdeModulePkg/Core/Dxe/Dispatcher/
DXE 的 Dispatcher 目录,里面是 DxeMain.c、Dispatcher.c 这些。DXE 阶段的核心逻辑之一就是"派发":从 Firmware Volume 里一个个找出 DXE 驱动,按照依赖表达式(DEPEX)排好顺序,该先跑的驱动先跑。
把这个目录看懂,你会明白:
DXE Core 是怎么从 PEI 手里接过 HOB 列表的
gBS(Boot Services Table)是怎么初始化并填进 EFI System Table 的
驱动派发的依赖顺序是怎么算出来的
这里有个经典坑:依赖没满足的驱动不会被派发,而新手调试"我的驱动为什么不跑"时,90% 卡在这——要么 DEPEX 写错了,要么 FV 里根本没打包进去。看懂 Dispatcher,这类问题一眼就能定位。
3️⃣ MdePkg/Include/IndustryStandard/Spi.h
选这个文件是想告诉你一件事:BIOS 不是只写 C 逻辑,你还得懂硬件协议。SPI Flash 是 BIOS 芯片的老家,这个头文件定义了 SPI 的 JEDEC 命令——读、写、擦除、读状态寄存器、读 JEDEC ID 这些。
看懂这个,你就知道为什么刷 BIOS 要"先擦再写"、为什么 SPI Flash 有 4KB 扇区擦除和 64KB 块擦除的区别、为什么写之前必须先发 Write Enable。这些都是你以后碰 Flashrom、碰烧录器时躲不掉的底层知识。
🗺️ 一个建议的学习顺序
💡 最后一句实话
资源不在多,在用得对。我见过有人书买齐了、spec 下载了一堆,结果半年过去还在目录页打转。真正让你入门的,是那一台跑着 OVMF 的虚拟机、那一段你亲手加上去的 Hello World PEIM、和那 3 个你真正一行行读懂的源码文件。
把这篇和下一篇(QEMU+OVMF 实战)连起来用,你就知道该从哪动手了。
固件笔记 · 笔记本BIOS老兵实战记录