1、UEFI概述:从起源到启动流程
大家好,我是你们的讲师。今天咱们开始聊UEFI。说实话,我入行那会儿,BIOS还是绝对的霸主。那时候调试个启动问题,全靠蜂鸣器长短音猜故障,想想都头大。后来UEFI慢慢普及,我才算真正从“黑盒”里解放出来。
这一章,我们先不急着写代码。先把UEFI的来龙去脉、它跟传统BIOS到底差在哪、以及它开机时究竟干了些什么,理清楚。这些是后面所有实战的基础。
1.1 UEFI的起源与发展
UEFI的全称是 Unified Extensible Firmware Interface,统一可扩展固件接口。它最初不叫这名,叫EFI,是Intel搞出来的。
为什么会有EFI?
说白了,传统BIOS太老了。它诞生于1980年代,为了兼容性,一直没敢大改。但到了90年代末,硬件发展太快,BIOS的瓶颈越来越明显:
- 只能识别2TB硬盘:MBR分区表最大就支持2TB,现在随便一个硬盘都4TB、8TB了。
- 启动慢:BIOS要先自检所有硬件,那会儿内存小还好,现在动不动64GB内存,自检一遍得十几秒。
- 界面丑、操作难:蓝底白字,全靠键盘。我当年给客户远程调启动项,电话里说“按F2进BIOS,然后选Boot,再选Hard Drive...”客户直接懵了。
- 扩展性差:BIOS跑在16位实模式下,代码空间就1MB,想加个新功能?难。
Intel在2000年左右推出了安腾处理器,想搞个全新的固件接口,这就是EFI 1.0。后来安腾没火起来,但EFI这个框架被保留了下来。2005年,UEFI论坛成立,把EFI标准化成了UEFI。从2.0、2.1一路更新到现在,最新的规范已经是2.10了。
1.2 UEFI与传统BIOS的区别
很多刚接触UEFI的同学会问:“UEFI不就是个新BIOS吗?”嗯,这么说也对,但不够准确。我列个表,大家一看就明白。
| 对比项 | 传统BIOS | UEFI |
|---|---|---|
| 运行模式 | 16位实模式 | 32/64位保护模式、长模式 |
| 寻址能力 | 1MB(实际可用更少) | 理论无限制(64位地址空间) |
| 磁盘分区 | MBR(最大2TB) | GPT(最大9.4ZB) |
| 启动速度 | 慢(全硬件自检) | 快(仅初始化必要设备) |
| 用户界面 | 文本菜单,键盘操作 | 支持图形界面,可鼠标操作 |
| 驱动模型 | Option ROM,16位 | UEFI Driver,跨平台 |
| 网络支持 | 基本没有 | 原生支持UEFI网络栈 |
| 安全性 | 无 | Secure Boot、Measured Boot |
核心区别一句话:BIOS是固件,UEFI是介于固件和操作系统之间的一个微型操作系统。
你想想看,UEFI有自己的驱动模型、协议栈、甚至还能跑简单的应用程序(比如UEFI Shell)。它本质上是一个在硬件初始化完成后、操作系统启动前运行的轻量级环境。
1.3 UEFI的启动流程概览
这部分是重点。UEFI的启动流程,我把它分成七个阶段。每个阶段都有明确的任务。我在项目中遇到过好几次启动卡死的问题,最后都是靠排查这些阶段定位到的。
先看一张整体流程图:
下面我逐个阶段简单说一下:
- SEC(安全验证阶段):这是CPU复位后执行的第一段代码。它验证后续固件的完整性。嗯,这里要注意,如果启用了Secure Boot,SEC阶段会检查PEI阶段的签名。
- PEI(EFI前初始化阶段):主要任务是初始化内存。没有内存,啥也干不了。PEI阶段会检测CPU、芯片组,然后找到内存控制器,把内存初始化好。
- DXE(驱动执行环境阶段):内存有了,就可以加载各种驱动了。PCIe设备、SATA控制器、USB控制器...所有设备的UEFI驱动都在这个阶段加载。
- BDS(启动设备选择阶段):驱动都加载完了,该决定从哪个设备启动了。UEFI会按照Boot Order列表,依次尝试每个启动项。
- TSL(操作系统加载前阶段):找到了启动设备,加载操作系统加载器(比如Windows的bootmgfw.efi)。
- RT(运行时阶段):操作系统加载器执行ExitBootServices(),UEFI交出控制权。但UEFI的运行时服务(比如GetVariable、SetVariable)仍然可用。
- AL(操作系统启动完成):操作系统完全接管硬件,UEFI的任务到此结束。
好了,这一章的内容就这些。UEFI的起源、它跟BIOS的区别、以及启动流程的七个阶段,大家有个整体印象就行。后面每一章,我们都会深入其中一个阶段或功能,一步步把UEFI启动和可信启动配置搞明白。