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了。

我个人习惯:看UEFI规范时,别从头读到尾。先看卷2(DXE基础),再看卷3(协议),最后看卷4(SMM)。这样上手最快。

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的启动流程,我把它分成七个阶段。每个阶段都有明确的任务。我在项目中遇到过好几次启动卡死的问题,最后都是靠排查这些阶段定位到的。

先看一张整体流程图:

UEFI启动流程概览 UEFI 启动流程概览 SEC 安全验证 PEI 内存初始化 DXE 驱动执行 BDS 启动设备选择 TSL OS加载前 RT 运行时服务 AL OS启动完成 说明: • SEC→PEI→DXE→BDS 为启动前阶段(Boot Services) • TSL 是操作系统加载器执行阶段 • RT 阶段开始,UEFI 交出控制权,仅保留运行时服务 • AL 阶段表示操作系统完全接管硬件

下面我逐个阶段简单说一下:

  1. SEC(安全验证阶段):这是CPU复位后执行的第一段代码。它验证后续固件的完整性。嗯,这里要注意,如果启用了Secure Boot,SEC阶段会检查PEI阶段的签名。
  2. PEI(EFI前初始化阶段):主要任务是初始化内存。没有内存,啥也干不了。PEI阶段会检测CPU、芯片组,然后找到内存控制器,把内存初始化好。
  3. DXE(驱动执行环境阶段):内存有了,就可以加载各种驱动了。PCIe设备、SATA控制器、USB控制器...所有设备的UEFI驱动都在这个阶段加载。
  4. BDS(启动设备选择阶段):驱动都加载完了,该决定从哪个设备启动了。UEFI会按照Boot Order列表,依次尝试每个启动项。
  5. TSL(操作系统加载前阶段):找到了启动设备,加载操作系统加载器(比如Windows的bootmgfw.efi)。
  6. RT(运行时阶段):操作系统加载器执行ExitBootServices(),UEFI交出控制权。但UEFI的运行时服务(比如GetVariable、SetVariable)仍然可用。
  7. AL(操作系统启动完成):操作系统完全接管硬件,UEFI的任务到此结束。
我曾经遇到过一个问题:某款主板在DXE阶段总是卡死。排查了很久,最后发现是某个PCIe网卡的UEFI驱动有bug,加载时死循环了。换了个网卡就好了。所以,如果遇到启动卡死,先看是哪个阶段出的问题,能省很多时间。

好了,这一章的内容就这些。UEFI的起源、它跟BIOS的区别、以及启动流程的七个阶段,大家有个整体印象就行。后面每一章,我们都会深入其中一个阶段或功能,一步步把UEFI启动和可信启动配置搞明白。