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启动流程概览。它把上面讲的六个阶段串起来了:
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——每一步都是为了解决实际问题。