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的启动流程大概是这样的:

  1. SEC阶段:安全验证,初始化CPU和内存
  2. PEI阶段:内存初始化,检测硬件
  3. DXE阶段:加载驱动,枚举设备
  4. BDS阶段:启动设备选择,加载OS
  5. TSL阶段:操作系统加载前准备
  6. RT阶段:操作系统运行时服务
  7. 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给了我们一个标准方案:

  1. UEFI固件验证BootLoader签名
  2. BootLoader验证OS内核签名
  3. OS内核验证TEE镜像签名

这样,整个启动链都是可信的。TEE只需要信任UEFI固件就行。

1.6 一张图看懂UEFI启动流程

下面是我画的UEFI启动流程图,涵盖了从硬件上电到OS加载的完整过程:

UEFI启动流程 SEC阶段 安全验证、CPU初始化 PEI阶段 内存初始化、硬件检测 DXE阶段 驱动加载、设备枚举 BDS阶段 启动设备选择 TSL阶段 OS加载前准备 RT阶段 操作系统运行时服务 安全启动链 UEFI固件 → BootLoader BootLoader → OS内核 OS内核 → TEE镜像 TEE适配关键点 • Secure Boot验证 • 内存隔离保护 • 可信启动链建立

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建立可信启动链

可可精品资料库