1、UEFI的前世今生:从BIOS到UEFI的演进
1.1 为什么还要聊BIOS?
说实话,做固件这么多年,我经常被问到同一个问题:「BIOS都淘汰了,还学它干嘛?」
嗯,这个问题问得好。但我想说的是——你不了解BIOS的痛,就理解不了UEFI的好。
我2010年刚入行时,还在维护一个老旧的BIOS项目。那时候每天最怕的就是客户说「加个新功能」。为什么?因为BIOS的16位实模式,代码空间就1MB,你想想看,塞个USB启动都费劲。
BIOS(Basic Input/Output System)诞生于1981年,跟IBM PC一起面世。它跑在16位实模式下,用汇编语言写的。那时候硬盘才10MB,没人想到30年后会有2TB的硬盘、UEFI、Secure Boot这些东西。
BIOS的核心限制:
- 16位实模式,寻址空间只有1MB
- MBR分区表,最大支持2TB硬盘
- 只能从硬盘、光驱、软盘启动
- 没有图形界面,纯文本菜单
- 扩展性差,加个驱动得改BIOS代码
我在项目中遇到过最典型的场景:客户要支持从NVMe SSD启动。BIOS根本不认识NVMe设备,得自己写Option ROM,还得塞进那可怜的1MB空间里。折腾了两周,最后客户说「算了,还是用SATA吧」。
3.2 UEFI是怎么来的?
Intel在1998年启动了一个项目,叫「Intel Boot Initiative」。后来改名为EFI(Extensible Firmware Interface)。2005年,UEFI论坛成立,EFI变成了UEFI(Unified EFI)。
说白了,UEFI就是BIOS的「全面升级版」。它不再是16位实模式,而是64位保护模式。不再是1MB空间,而是可以用整个内存。不再是汇编语言,而是C语言甚至更高级的语言。
我个人习惯:把UEFI理解成一个微型操作系统。它有CPU驱动、总线驱动、设备驱动,甚至有自己的文件系统(FAT)。启动时,它先初始化硬件,然后加载操作系统。这个过程跟Linux启动很像。
1.3 UEFI规范到底说了什么?
UEFI规范现在有2000多页。别怕,核心就几个概念:
| 概念 | 说明 | 我的理解 |
|---|---|---|
| UEFI固件 | 运行在主板上的固件代码 | 就是UEFI的「内核」 |
| UEFI驱动 | 可加载的驱动模块 | 类似Linux的.ko文件 |
| UEFI应用 | 启动管理器、Shell等 | 类似Linux的用户态程序 |
| GPT分区表 | 替代MBR的新分区格式 | 支持2TB+硬盘 |
| Secure Boot | 安全启动机制 | 防止恶意代码注入 |
UEFI的启动流程大概是这样的:
- SEC阶段:安全验证,初始化CPU和内存
- PEI阶段:内存初始化,检测硬件
- DXE阶段:加载驱动,枚举设备
- BDS阶段:启动设备选择,加载OS
- TSL阶段:操作系统加载前准备
- RT阶段:操作系统运行时服务
- AL阶段:系统关机或重启
你可能会问:「为什么分这么多阶段?」
嗯,这是为了模块化和安全性。每个阶段只做一件事,做完就交给下一阶段。出了问题,也容易定位。我在调试一个UEFI启动卡死的问题时,就是靠阶段日志定位到DXE阶段某个驱动加载失败。
1.4 UEFI vs BIOS:一张表说清楚
| 对比项 | BIOS | UEFI |
|---|---|---|
| 运行模式 | 16位实模式 | 32/64位保护模式 |
| 寻址空间 | 1MB | 整个内存 |
| 分区表 | MBR(最大2TB) | GPT(最大9.4ZB) |
| 启动速度 | 慢(逐设备检测) | 快(并行初始化) |
| 网络支持 | 基本没有 | 原生支持PXE |
| 安全机制 | 无 | Secure Boot |
| 扩展性 | 差(Option ROM) | 好(UEFI驱动) |
| 用户界面 | 文本菜单 | 图形界面 |
避坑指南:我曾经遇到一个项目,客户说「我们支持UEFI启动」,结果发现只是把BIOS的启动菜单改成了图形界面,底层还是BIOS。这不是UEFI,这是「披着UEFI皮的BIOS」。真正的UEFI必须支持GPT分区、Secure Boot、UEFI驱动加载这些核心特性。
1.5 为什么TEE要适配UEFI?
这个问题其实很关键。TEE(可信执行环境)需要安全的启动链。从硬件上电开始,每一级都要验证签名,确保没有被篡改。
UEFI的Secure Boot正好提供了这个能力。它从固件层面就开始验证,一直延伸到操作系统内核。TEE可以借助UEFI的启动链,建立自己的信任根。
我在做TEE适配时,最头疼的就是「信任链怎么建立」。UEFI的Secure Boot给了我们一个标准方案:
- UEFI固件验证BootLoader签名
- BootLoader验证OS内核签名
- OS内核验证TEE镜像签名
这样,整个启动链都是可信的。TEE只需要信任UEFI固件就行。
1.6 一张图看懂UEFI启动流程
下面是我画的UEFI启动流程图,涵盖了从硬件上电到OS加载的完整过程:
1.7 小结
UEFI不是BIOS的简单升级,而是一次彻底的重新设计。它解决了BIOS的几乎所有痛点:寻址空间、启动速度、安全性、扩展性。
对于TEE适配来说,UEFI的Secure Boot和模块化设计是天然的优势。你不需要自己从头搭建信任链,UEFI已经帮你做好了。
嗯,这一章就到这里。记住一句话:UEFI是固件,不是BIOS。它是微型操作系统,不是简单的启动代码。
核心要点回顾:
- BIOS是16位实模式,UEFI是64位保护模式
- UEFI有7个启动阶段:SEC→PEI→DXE→BDS→TSL→RT→AL
- UEFI规范核心:固件、驱动、应用、GPT、Secure Boot
- TEE适配UEFI的关键:利用Secure Boot建立可信启动链