先用QEMU/OVMF加EDK II跑通UEFI Hello World,再补C语言、体系结构、ACPI规范,最后用真机做硬件验证;必备工具以QEMU、GDB、EDK II、NASM、iasl为核心,学习资源优先看TianoCore、UEFI论坛规范和OSDev。
固件离应用层很远,但虚拟机把它拉近了,你不需要先焊板子,也不必等硬件到货,只要一台支持KVM的Linux机器,就能编译、启动、断点、看串口、改ACPI表,业内专家指出,固件问题往往不是“不会写代码”,而是对启动时序、内存映射和规范细节理解不足,虚拟机恰好能让你反复试错。
虚拟机固件编程如何入门?先搞清三条主线
C与体系结构是底座
别急着打开EDK II,先确认三件事:
- 能读懂指针、结构体、函数指针、位域。
- 理解x86或ARM的启动流程、内存空间、中断、MMIO。
- 会用Git、Make、GCC/Clang、GDB。
固件代码大量操作硬件寄存器,C语言不扎实,后面看PI规范会很痛苦。
规范与源码一起读
只看规范容易困,只看源码容易迷路,建议对照读:
- UEFI Specification:启动服务、运行时服务、协议、事件。
- PI Specification:PEI、DXE、BDS、SMM等阶段。
- ACPI Specification:DSDT、SSDT、MADT、FADT。
- TianoCore EDK II源码:OvmfPkg、MdeModulePkg、MdePkg。
每读一个协议,就在QEMU里找对应实现,比如SimpleFileSystem、BlockIo、GraphicsOutput。
用虚拟机把“编译-启动-调试”跑通
这是入门的分水岭,能稳定启动OVMF,能打断点,能看串口日志,才算摸到门,不要一开始就追SMM、BMC、PCIe枚举,先把最小闭环跑通。
虚拟机固件编程必备工具与学习资源清单
必备工具
| 工具 | 用途 | 入门建议 |
|---|---|---|
| QEMU | 虚拟硬件平台 | 先跑x86_64 OVMF,再试aarch64 virt |
| EDK II | UEFI固件开发框架 | 编译OvmfPkg,改HelloWorld |
| GDB | 源码级调试 | 配合QEMU -s -S |
| NASM | 汇编器 | 看启动汇编和选项ROM |
| iasl | ACPI表编译/反编译 | 反编译DSDT,改SSDT |
| OpenOCD | 真机JTAG/SWD调试 | 虚拟机稳定后再上 |
| Renode | 嵌入式仿真 | 练ARM Cortex-M/RISC-V |
| Buildroot/Yocto | 系统镜像构建 | 搭根文件系统与启动链 |
据QEMU官方文档,QEMU的GDB stub可直接连接GDB,适合固件早期调试,常用命令:
sudo apt update sudo apt install qemu-system-x86 qemu-utils ovmf gdb git build-essential nasm acpica-tools python3-pip git clone https://github.com/tianocore/edk2.git cd edk2 git submodule update --init source edksetup.sh make -C BaseTools build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -m 1024 -serial stdio -net none
如果QEMU报KVM权限错误,执行sudo usermod -aG kvm $USER后重新登录。
学习资源
- TianoCore EDK II文档与示例:最贴近UEFI开发实战。
- UEFI论坛公开规范:查协议、服务、启动阶段。
- OSDev Wiki:补启动、分页、中断、ACPI基础。
- coreboot文档:看真实平台初始化。
- U-Boot文档:嵌入式启动链。
- OpenBMC文档:服务器管理固件。
- Trusted Firmware-A文档:ARM安全启动。
- Linux内核文档:ACPI、PCI、设备树。
这些资源大多免费,在上海、深圳等固件岗位密集的城市,招聘方更看重你是否能读懂规范并定位启动问题,而不是背多少协议名。

固件开发用虚拟机还是真机好?一张表看清
| 维度 | 虚拟机 | 真机 |
|---|---|---|
| 成本 | 低,一台PC即可 | 开发板、调试器、仪器更贵 |
| 调试 | 快照、回滚、GDB方便 | 受限于JTAG/SWD和串口 |
| 硬件覆盖 | 虚拟设备有限 | 真实电源、时钟、外设 |
| 启动时序 | 可控但不够真实 | 更接近量产 |
| 适合阶段 | 日常开发、CI、入门 | 兼容性、性能、功耗验证 |
| 风险 | 容易忽略真实硬件差异 | 变砖、烧录失败、周期长 |
行业共识认为,虚拟机负责日常迭代和CI,真机负责最终兼容性验证,比较稳的节奏是:QEMU里写驱动、改ACPI、跑启动;真机上验证PCIe枚举、电源管理、SMM、BMC。
零基础学习UEFI固件开发难吗?按这个顺序练
难,但不是玄学,按下面顺序,多数人能少走弯路。
- 装Ubuntu,配好KVM、QEMU、EDK II。
- 编译OVMF,让QEMU进入UEFI Shell。
- 写第一个UEFI应用:打印
Hello UEFI,编译成.efi。 - 在QEMU里加载
.efi,用-serial stdio看输出。 - 用GDB连QEMU,在
UefiMain下断点。 - 写一个DXE驱动,挂到
gBS->InstallProtocolInterface。 - 读DSDT,改SSDT,用
iasl编译后塞进QEMU。 - 试aarch64:
qemu-system-aarch64 -M virt -bios QEMU_EFI.fd。 - 试U-Boot或coreboot,观察启动链。
- 上真机,用OpenOCD或串口定位差异。

常见坑:
- EDK II子模块没更新,编译报缺文件。
- GCC版本太新或太旧,
build失败。 - OVMF路径写错,QEMU仍走默认固件。
- 串口没重定向,看不到调试输出。
- 调试符号没加载,GDB只有汇编。
- 虚拟机时间不准,影响超时和日志。
行业公开资料显示,固件入门最耗时的不是写代码,而是建立“规范-源码-硬件行为”的对应关系,每天投入一两个小时,通常几个月能跑通基础闭环。
虚拟机固件开发培训价格多少?免费与付费怎么选
免费资源足够入门,TianoCore、QEMU、OSDev、coreboot文档都不收费,付费课程价格差异大:录播课常见几百元到数千元,直播班或一对一更高,企业内训按天报价,若只是入门,先别急着买课,把OVMF编译、GDB调试、UEFI应用和DXE驱动跑通,再决定是否补课,开发板则从几百元到上千元不等,ARM、RISC-V、x86平台差别明显。
虚拟机固件编程入门Q&A:工具、调试与学习路径
虚拟机固件编程入门一定要买开发板吗?
不必,QEMU加OVMF能覆盖UEFI应用、DXE驱动、ACPI表调试的日常练习,开发板用于验证真实硬件初始化、电源管理和启动时序,先虚拟机,后真机,成本更低。
虚拟机固件编程和嵌入式固件编程差别大吗?
有重叠,UEFI偏平台启动、规范和协议;嵌入式偏RTOS、BSP、外设驱动,工具链、调试思路相通,QEMU、OpenOCD、GDB常配合使用,会看寄存器手册和启动日志,两边都能迁移。
虚拟机固件编程如何从Hello World走到真实项目?
先写UEFI应用,再写DXE驱动,接着改OVMF模块,读ACPI和PCI表,最后用coreboot、U-Boot或OpenBMC项目练手,真实项目通常从日志、时序和规范差异入手。
