1、UEFI概述:UEFI的起源与发展、UEFI与BIOS的区别、UEFI的启动流程概览

1.1 从BIOS到UEFI——我亲历的那场变革

说起UEFI,得先聊聊它的前身——BIOS。BIOS这东西,从1981年IBM PC诞生就在了。说实话,它活得够久了。我入行那会儿,还在跟BIOS打交道,那时候就觉得这玩意儿有点「老态龙钟」了。

为什么会这么说?BIOS有几个硬伤:

  • 只能从16位实模式启动——你想想看,CPU都64位了,它还在用16位的方式干活
  • MBR分区表只支持2TB磁盘——现在随便一块硬盘就超过这个数
  • 启动流程死板——必须从第一个扇区开始,中间出点问题就黑屏

我记得2008年左右,Intel牵头搞了EFI(Extensible Firmware Interface),后来交给UEFI论坛管理,改名叫UEFI。说白了,就是给固件来了一次「现代化改造」。

关键时间节点:

  • 1998年:Intel启动EFI项目(安腾处理器需要)
  • 2005年:UEFI论坛成立,EFI 1.10演变为UEFI 2.0
  • 2010年后:主流PC厂商全面切换UEFI
  • 2020年:Legacy BIOS基本退出历史舞台

1.2 UEFI与BIOS的区别——一张表说清楚

我在给团队新人培训时,经常用这张表。它把两者的核心差异列得明明白白:

对比项 Legacy BIOS UEFI
处理器模式 16位实模式 32/64位保护模式+长模式
寻址能力 1MB(实际可用更少) 理论无限制(64位地址空间)
磁盘分区 MBR(最大2TB) GPT(最大9.4ZB)
启动方式 从MBR引导扇区加载 从ESP分区加载.efi文件
用户界面 文本菜单,键盘操作 支持图形界面、鼠标、网络
驱动模型 Option ROM,16位 UEFI Driver,跨平台
安全性 基本没有 Secure Boot、TPM支持
扩展性 差(中断向量表固定) 好(Protocol接口机制)

我的经验:刚接触UEFI时,最容易搞混的是「UEFI不是操作系统,它只是一个固件接口规范」。说白了,它定义了操作系统和硬件之间的「对话规则」,而不是一个具体的软件。

1.3 UEFI启动流程概览——从按下电源键到加载OS

嗯,这里要重点讲。UEFI的启动流程,我拆成几个阶段来讲。每个阶段都有它存在的意义。

阶段一:SEC(Security)——安全验证

按下电源键,CPU复位,第一条指令从固件映射的地址开始执行。SEC阶段做三件事:验证固件完整性、初始化临时内存(Cache as RAM)、传递启动参数。我曾经遇到过一台机器,SEC阶段卡住,最后发现是SPI Flash的校验和不对。

阶段二:PEI(Pre-EFI Initialization)——早期初始化

这个阶段负责把CPU、芯片组、内存初始化好。PEI阶段运行在临时内存上,代码量很小。我习惯把PEI看作「先搭个脚手架」,为后面的DXE阶段铺路。

阶段三:DXE(Driver Execution Environment)——驱动执行环境

DXE阶段是UEFI的核心。所有UEFI Driver在这里加载,各种Protocol被安装。说白了,这个阶段把硬件能力「暴露」给上层。DXE阶段结束后,系统已经有了完整的硬件抽象层。

阶段四:BDS(Boot Device Selection)——启动设备选择

BDS阶段负责决定从哪个设备启动。它会遍历启动顺序列表,找到第一个可用的启动项。如果所有设备都失败,就进入UEFI Shell或者设置界面。

阶段五:TSL(Transient System Load)——操作系统加载

Boot Loader(比如GRUB、Windows Boot Manager)被加载并执行。它负责读取OS内核文件,准备启动参数,然后调用ExitBootServices()退出UEFI环境。

阶段六:RT(Runtime)——运行时

操作系统接管硬件控制权。UEFI只保留少量Runtime Service(比如GetVariable、SetVariable、ResetSystem)。这时候UEFI基本「退居二线」了。

避坑指南:我曾经在调试一个项目时,发现系统在ExitBootServices()之后崩溃。查了两天才发现,是某个UEFI Driver在退出后还在访问系统内存。记住:ExitBootServices()之后,UEFI不能再分配或释放内存,否则必挂。

1.4 UEFI启动流程全景图

下面这张图,是我自己画的一个UEFI启动流程概览。它把上面讲的六个阶段串起来了:

UEFI 启动流程全景图 SEC 安全验证 PEI 早期初始化 DXE 驱动执行环境 BDS 启动设备选择 TSL OS加载 RT 运行时服务 各阶段关键说明: • SEC:CPU复位,Cache as RAM,验证固件签名 • PEI:初始化内存控制器,安装PEIM模块 • DXE:加载UEFI Driver,安装Protocol,创建Handles • BDS:遍历Boot Order,加载Boot Manager • TSL:Boot Loader执行,ExitBootServices()调用 • RT:仅保留Runtime Service,OS完全接管硬件

1.5 为什么UEFI比BIOS更「香」?

说白了,UEFI解决了BIOS时代的几个核心痛点:

  • 启动更快——UEFI可以并行初始化设备,BIOS只能串行
  • 更安全——Secure Boot防止恶意Bootkit加载
  • 更灵活——UEFI Shell可以直接调试硬件,不用烧固件
  • 更易扩展——Protocol机制让驱动开发像搭积木

我的建议:如果你是刚接触UEFI,别急着看代码。先把启动流程走一遍,理解每个阶段「为什么存在」。我见过太多人一上来就啃EDK2源码,结果被各种Protocol绕晕。先画流程图,再动手。

1.6 本章小结

UEFI不是凭空冒出来的,它是BIOS在新时代的进化体。从16位实模式到64位保护模式,从MBR到GPT,从Option ROM到UEFI Driver——每一步都是为了解决实际问题。