想象你是智达酒店的老板。今天上午十点整,酒店就要正式开门营业——但你按下总电源的瞬间,整栋大楼还只是一堆钢筋水泥。走廊没有灯,电梯不运行,前台电脑黑着屏。从「按下按钮」到「第一位客人走进大堂」,酒店里上演着一场精确到毫秒的接力:安保系统验证钥匙是否可信,工程部确认水电燃气,各部门员工带着工具就位,大堂经理看一眼排班表决定今天先开哪几个业务窗口,最后领班把总控钥匙交到店长手里,酒店宣告正式开业。 计算机的启动就是同一场接力。UEFI 启动协议(Unified Extensible Firmware Interface,统一可扩展固件接口)规定了这台「数字酒店」从断电状态到操作系统全面接管之间的一整套流程。这一篇里,我们不做枯燥的规范条文串讲,而是跟着这场开业接力走一遍:启动流程有哪些阶段、UEFI 和过去的老 BIOS 差在哪、启动管理器如何排班、磁盘分区表如何布局、安全启动如何把关、固件提供哪些服务、引导加载程序如何交接,以及出了状况该怎么排查。
掌握 UEFI 启动协议,是你理解底层系统、定位启动故障、做固件级调优的入门钥匙——无论云端裸金属服务器还是边缘 AI 设备,这套知识都能让你在系统现场快速找到问题根源。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
启动流程概览
开业前夜,酒店老板在总控台按下「开业准备」按钮。大楼里立刻自动运转起来:保安总控室先验证各处门禁锁具是否原装可信,工程部确认基础水电,各部门领班和设备一台台就位,大堂经理打开排班表。这一连串动作在 UEFI 里对应着六个固定阶段,被称为企业启动链(boot chain)。只要理解了这条链,你就能读懂开机时固件到底在忙什么。
计算机通电的一瞬间,CPU 还不能直接运行操作系统——它连内存控制器都还没初始化。于是 UEFI 固件把冷启动切成六个阶段,每个阶段只做特定的事,做完就交接给下一棒。这六个阶段像一场接力赛:选手不能越界,必须一棒一棒往前递。
六个阶段分别是:SEC(Security,安全验证)、PEI(Pre-EFI Initialization,预 EFI 初始化)、DXE(Driver Execution Environment,驱动执行环境)、BDS(Boot Device Selection,启动设备选择)、TSL(Transient System Load,瞬时系统加载)和 RT(Runtime,运行时)。SEC 像保安总控,验证最前端的启动代码是否可信;PEI 像工程部,把 CPU 和内存这间「毛坯房」的基础打通;DXE 是各部门员工带着设备上台,枚举所有硬件;BDS 由启动管理器决定从哪个设备启动;TSL 把引导程序拉起来;RT 则是操作系统正式接管后的常驻阶段。
所以按下开机键那一刻,你看到的并不是「黑屏等待」,而是六个部门在毫秒级地接力。等到 RT 阶段,总控钥匙到了店长手上,酒店才真正开始营业——屏幕上才出现熟悉的系统登录画面。
- SEC 安全阶段固件第一道岗哨,验证最核心的启动代码是否完整可信。
- PEI 预初始化CPU 和内存刚通电还是「毛坯房」,这一步把基础环境打通。
- DXE 驱动环境各种驱动被逐个加载,硬件设备「点名报到」。
- BDS 设备选择启动管理器根据排班表决定优先启动哪个设备。
- TSL 系统加载引导程序镜像被读入内存,等待交接。
- RT 运行时固件交出控制权,操作系统全面接管。
UEFI与BIOS
同一家酒店,有两种管理流派。老式招待所靠一个前台、一本纸质登记簿和墙上的电话分机——这就是传统 BIOS 的作风。而智达酒店用的是全套数字化物业系统——这就是 UEFI。要理解 UEFI 启动协议,得先明白它取代的是什么。
BIOS(Basic Input Output System,基本输入输出系统)诞生于三十多年前。它运行在 16 位实模式下,地址空间只有 1MB,通过软中断(比如 INT 13h 读写磁盘)为操作系统提供最原始的服务。它像一个只有固定公式的笔记本——功能有限,但可靠到近乎古董。当磁盘超过 2TB、硬件越来越复杂时,这本「固定公式笔记本」就明显不够用了。
UEFI 则完全换了一套思路:固件本身用 64 位 C 语言编写,模块化加载驱动,以「协议」(Protocol)的方式对外提供接口。所有服务的总入口是一张 EFI 系统表(gST)——相当于酒店总控室的「主控制面板」。面板上嵌着厂商信息、控制台句柄、启动服务指针和运行时服务指针。为了让老硬件也被照顾,UEFI 还提供了 CSM(Compatibility Support Module,兼容支持模块),相当于让新酒店偶尔按老招待所的规矩接待特殊客人。
说白了,BIOS 是一本写死的操作手册,UEFI 是一套可以扩展的数字化管理平台。前者靠电话线(中断)叫服务,后者直接递给你一张总控制台蓝图(系统表指针)。
- 系统表头EFI 系统表总目录的开头有签名与版本信息。
- 厂商信息字段记录固件由哪家厂商提供、修订号是多少。
- 控制台句柄指向键盘和屏幕的输入输出接口,让引导程序能「说话」。
- 服务表指针两个大服务台——启动服务与运行时服务,分别给出函数表地址。
启动管理器
酒店大堂有一块电子排班屏,上面按优先级列着:10:00 酒店正式营业、11:00 会议室接待、14:00 健身房开放……这不是随便写的,而是大堂经理(Boot Manager)依据总部的排班表(BootOrder)自动排好的。哪项业务排在前面,就先启动哪个。计算机世界的「排班表」就存在固件的 NVRAM(非易失内存)里。
UEFI 的启动管理器(Boot Manager)是固件里的一个小型调度程序。它的排班表存在 NVRAM 变量 BootOrder 中——一个 16 位启动项编号(Boot####)的有序数组。每个启动项本身又是一个 LoadOption 变量,记录启动描述、文件路径(如 \EFI\GRUB\grubx64.efi)、属性和可选参数。启动时,启动管理器从前往后找第一个「激活」的启动项;如果在 BootTimeout 秒内用户按下了启动菜单热键,就弹出自选界面。
这套机制把「开机优先从哪启动」完全数据化:你不用重刷固件、不用改跳线,改一行变量就能调整优先级。Windows 的 bootmgfw.efi、GRUB 的 grubx64.efi、网络启动的 IPv6 PXE 条目,全是排班表上的一个个「业务窗口」。
排班表可以随时改:你在固件设置里调整启动顺序,本质上就是在改写 NVRAM 里的 BootOrder。哪个部门先开门、哪个业务优先,经理说了算,而不是把整个酒店重新装修一遍。
- BootOrder 列表排班表是一个有序数组,每个元素是 16 位启动选项编号。
- 激活过滤若启动设备不在位(例如没插 U 盘),该选项被视为不可用。
- 取最靠前可用项按下标从小到大,找到第一个可用的启动项。
- 超时等待默认等几秒让用户手动选择,超时后自动启动 b*。
GPT分区表
客人进了酒店,怎么快速找到自己的房间?靠楼层分布图。GPT(GUID Partition Table,全局唯一标识分区表)就是磁盘的楼层分布图。UEFI 启动协议之所以能支持大容量磁盘、多分区、灵活引导,离不开 GPT 这套「图纸」。
GPT 布局非常规整:LBA0 是保护性 MBR,防止老式 BIOS 磁盘工具误以为磁盘是空的;LBA1 是 GPT 头,记录分区表位置、CRC 校验和磁盘 GUID;LBA2 到 LBA33 是默认的 128 个分区表项,每项 128 字节。其中必有一个 EFI 系统分区(ESP,EFI System Partition),格式为 FAT32,里面装着引导程序 .efi 文件——相当于大堂旁边那个挂满钥匙的钥匙柜。
相比 MBR 最多 4 个主分区、2TB 寻址上限,GPT 支持 128 个分区,理论容量高达 8 ZB。每一块 GPT 磁盘还有一个备份 GPT 头放在磁盘末尾,主头损坏时固件可以自动回退,像酒店楼梯间里永远多备一份消防图。
没有楼层布局图的酒店一定乱套。同样,一块新磁盘装系统前,固件先看 GPT 头——它要是坏了,固件就像站在没有楼层图的酒店大堂里,完全迷路。
- 保护 MBR(LBA0)第一个扇区保留给老 BIOS,防止旧工具把 GPT 磁盘当成空盘。
- GPT 头(LBA1)存放分区表入口、CRC32 校验、磁盘 GUID 与备份位置。
- 分区表项(LBA2~33)每项 128 字节,默认共 128 个分区项,正好占满 32 个扇区。
- 容量上限用 64 位扇区号寻址,理论最大容量约 8 ZB。
安全启动
酒店核心机房不是谁都能进。门禁系统里有四份名单:业主的总权限卡(PK)、授权给门禁公司的授权卡(KEK)、允许进入的员工名单(DB)和禁止进入的失信名单(DBX)。这就是 Secure Boot(安全启动)的核心模型,UEFI 2.3.1c 之后正式成为标准能力。
安全启动,是固件在启动引导程序之前对 .efi 镜像做的完整性验证。固件先计算镜像摘要,然后要求该镜像带有一份由 DB(签名数据库)中证书签名的签名——签名有效才放行;同时还要把摘要与 DBX(黑名单数据库)比对,命中即拒绝。PK(Platform Key,平台密钥)是最高权威,只有用它签名的 KEK(Key Exchange Key,密钥交换密钥)才被信任;KEK 又负责签署 DB 与 DBX 的更新。
固件在 Setup 模式下可自由安装密钥,切到 User 模式后则严格执行验证。一旦 Secure Boot 开启而内核没有签名,屏幕就会给出 "Security Violation" 的拒绝启动提示。对普通用户来说,最常见的困惑是安装 Linux 发行版时被这道门禁拦下——不是系统坏了,而是你的引导程序不在信任名单上。
为 Linux 编译一个自研内核却忘了签名,就像员工忘了带工牌——门禁系统毫不留情地把你拦在外面。解决办法不是砸门,而是把新密钥导入 MOK 或关闭 Secure Boot。
- 镜像摘要对要启动的 .efi 文件做安全散列,得到固定长度的摘要。
- 签名校验用 DB 白名单里的证书验证镜像携带的签名。
- 黑名单复查确认镜像摘要没有被吊销标记。
- 模式判断Setup 模式可自由装密钥,User 模式严格执行验证。
固件驱动服务
酒店正式营业前,各部门都有自己的服务台:前台办入住、工程部修水电、后勤管物资。计算机固件也开放两类服务柜台:启动服务(Boot Services)和运行时服务(Runtime Services)。任何驱动和引导程序都要通过这些柜台请求固件帮忙。
启动服务只在启动阶段可用——内存分配、事件创建、协议查找、加载镜像等,在 ExitBootServices 之后全部下线,像营业前搭台子的临时工。运行时服务则像酒店 24 小时应急小组:读取变量(GetVariable)、设置变量(SetVariable)、读时钟(GetTime)、系统复位(ResetSystem),即使系统进入运行时依然在线。UEFI 还用事件(Event)和定时器(Timer)实现异步回调——比如按每秒一次的频率刷新屏幕,定时器频率由硬件决定,拿 tick 数换算微秒。
驱动之间通过「协议」(Protocol)互相协作。每个协议有一个全局唯一的 GUID 作为身份证,驱动安装协议后用 LocateProtocol 查找,就像对讲机里喊一句「工程部在吗」,响应者直接对接。这套机制让 UEFI 驱动像积木一样可插拔,也是它能取代 BIOS 固定中断调用的根本原因。
理解这两类服务的分界线很重要:驱动一旦注册了协议,后续设备就可以按协议对话;而启动服务一旦退出,所有临时通道都会关闭——就像开业典礼结束后,搭建舞台的临时工撤场,只留下物业和安保。
- 获取定时器频率先问硬件「一秒有多少 tick」。
- tick 转微秒一个 tick 的时长是频率的倒数,乘上 10^6 即微秒。
- 创建周期事件按指定周期创建定时器事件。
- 回调触发每个周期到点后,事件通知对应的回调函数。
引导加载程序
领班是开业典礼上的关键角色:他从大堂经理手里接过钥匙,穿过门禁,打开大门,然后对全场宣布:从此刻起,一切听店长指挥。这个领班就是引导加载程序(Boot Loader),店长就是操作系统内核。整个 UEFI 启动协议走到这里,迎来最高潮的交接时刻。
引导加载程序本身是一个 .efi 镜像,由上一棒(TSL 阶段或固件启动管理器)通过 LoadImage 读入内存、再经 StartImage 启动。它要做的核心三件事:把内核镜像加载到内存、把内存映射(哪些物理地址可用)整理好交给内核、最后调用 ExitBootServices 让固件退出启动服务。从这一刻起,固件不再干预系统运行,内核掌握全部硬件控制权。
常见引导程序有 GRUB2、systemd-boot、Windows Boot Manager(bootmgfw.efi)等。GRUB2 还支持从 ESP 读取配置文件、加载内核和 initramfs,再跳转到内核入口;Windows 则直接加载 winload.efi。无论哪家,最后一步都是同一个动作——退出启动服务。
交接的时刻非常关键:ExitBootServices 像领班把对讲机交到店长手里。一旦交了,原来的临时服务台全部撤走,再想让固件帮忙就只能调用运行时服务了。
- 加载内核镜像引导程序从 ESP 读取内核文件到内存。
- 启动镜像在返回的 Handle 上调用 StartImage,内核代码开始执行。
- 获取内存映射把物理内存布局完整交给内核。
- 退出启动服务关键的「交权」动作,此后固件不再提供启动服务。
排错与调试
开业当天总会有意外:门禁刷不开、排班屏黑屏、钥匙柜找不到钥匙。面对「开不了门」的酒店,大堂经理不能手忙脚乱,而要看监控、查日志、修名单、换钥匙。UEFI 启动排错也是同样的思路:先定位是哪一棒出了问题。
UEFI 启动故障常见四大类:安全启动拒签(Security Violation)、启动项指向的设备不存在、ESP 分区文件系统损坏、NVRAM 启动变量丢失。排错时先读状态码——UEFI 每个服务返回的 EFI_STATUS 用高位标记严重度,低位记录错误码;再看固件事件日志(Event Log)和串口调试输出。工具方面,Linux 下可用 efibootmgr 查询和重建 BootOrder,用 bcdedit 管理 Windows 启动项;UEFI Shell 是固件自带的命令行,能手动执行 .efi、查看变量;mokutil 管理安全启动的 MOK 密钥。
遇到「开机直接进固件设置」的情况,多半是 NVRAM 里的启动项全部失效;遇到「Security Violation」则优先检查 Secure Boot 的签名链。修复后往往还要重建 ESP 中的引导文件——也就是重新把钥匙挂回钥匙柜。
排错就像开业日的「复盘会」:先确认是哪一棒出了问题——门禁(Secure Boot)、排班(BootOrder)、钥匙柜(ESP)还是管理面板(NVRAM),再对症下药。熟悉了这套流程,再诡异的「开不了机」也只是一道四选一的判断题。
- 获取状态码调用固件服务后拿到的返回值。
- 读最高位第 63 位是严重度标记,1 代表异常。
- 提取错误码低 16 位记录具体错误类别。
- 查表定位把错误码映射到具体原因,再对症修复。
AI 应用场景
云数据中心裸金属服务器启动故障根因定位
阶段:智能运维(AIOps)
解决的问题:云厂商的裸金属服务器生命周期管理极度依赖 UEFI 启动链路。传统方式下,数千台服务器启动失败时,运维人员需要逐台进入固件 Shell 或抓取串口日志,手动比对状态码,耗时以小时计。AI 可以自动聚合固件事件日志、BootOrder 配置、硬件拓扑与历史维修记录,在秒级定位根因。
具体案例:某云厂商将 SEC/PEI/DXE/BDS 各阶段的固件事件、NVRAM 变量与 GPT 分区信息采集为结构化特征,训练分类模型区分「安全启动拒签」「ESP 文件缺失」「NVRAM 变量损坏」「BootOrder 指向失效」四类典型故障。上线后,批量开机的失败修复时间从平均 90 分钟降至 8 分钟。
固件供应链安全审计(AI 辅助逆向)
阶段:AI 安全(恶意代码检测)
解决的问题:UEFI 固件是 Bootkit 的高价值攻击目标,人工反汇编分析固件镜像中的每个 DXE 驱动如同大海捞针。AI 可以辅助安全研究员从固件二进制中提取特征片段,快速定位可疑代码段。
具体案例:安全团队对固件做反汇编与特征抽取,使用深度学习模型对函数级指令序列做异常检测,自动比对已知恶意引导工具(如 LoJax、CosmicStrand)的签名特征,辅助人工复核。
边缘 AI 设备固件自动化配置
阶段:边缘部署(自动化配置生成)
解决的问题:边缘 AI 设备形态多样,摄像头、工控机、机器人底盘的 UEFI 启动项和分区布局各不相同,手工配置极易出错。AI 可以根据设备硬件拓扑与目标系统镜像,自动生成 GPT 分区方案与 BootOrder 配置。
具体案例:某智能制造方案商基于设备元数据和规则引擎,用生成式 AI 自动输出「磁盘分区脚本 + efibootmgr 命令 + Secure Boot 密钥导入计划」,批量写入产线设备,使首次上电即可进入预定系统。
Python 演示
#!/usr/bin/env python3"""GPT partition table parser demo. Shows how UEFI boot protocol sees GPT disks:1. read LBA1 GPT header2. read partition entries3. locate ESP (EFI System Partition)"""import structimport sys GPT_SIG = b'EFI PART'SEC_SZ = 512ESP_GUID = 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B' def read_sector(f, lba): f.seek(lba * SEC_SZ) return f.read(SEC_SZ) def parse_guid(raw): b = bytes(raw[3::-1] + raw[5:3:-1] + raw[7:5:-1] + raw[8:16]) h = b.hex().upper() return '%s-%s-%s-%s-%s' % (h[0:8], h[8:12], h[12:16], h[16:20], h[20:32]) def parse_gpt(disk): with open(disk, 'rb') as f: hdr = read_sector(f, 1) if hdr[:8] != GPT_SIG: raise ValueError('no GPT signature at LBA1') part_lba = struct.unpack_from('<Q', hdr, 0x48)[0] num = struct.unpack_from('<I', hdr, 0x50)[0] psize = struct.unpack_from('<I', hdr, 0x54)[0] parts = [] for i in range(min(num, 128)): lba = part_lba + (i * psize) // SEC_SZ off = (i * psize) % SEC_SZ blob = read_sector(f, lba)[off:off + psize] if blob == b'\x00' * psize: continue type_guid = parse_guid(blob[0:16]) first = struct.unpack_from('<Q', blob, 0x20)[0] last = struct.unpack_from('<Q', blob, 0x28)[0] name = blob[56:128].decode('utf-16-le', 'replace') name = name.rstrip('\x00') parts.append((type_guid, first, last, name)) return parts def main(): disk = sys.argv[1] if len(sys.argv) > 1 else '/dev/sda' try: parts = parse_gpt(disk) except Exception as e: print('parse error:', e) sys.exit(1) print('Partition table on %s:' % disk) for i, (guid, first, last, name) in enumerate(parts): tag = 'ESP ' if guid == ESP_GUID else ' ' print('%s [%d] LBA %d..%d type %s name %r' % (tag, i, first, last, guid, name)) if __name__ == '__main__': main()
hdr = read_sector(f, 1)读取 LBA1 扇区,GPT 头固定存放在这里。if hdr[:8] != GPT_SIG:检查前 8 字节是否为 "EFI PART",不是则说明磁盘不是 GPT。struct.unpack_from('<Q', hdr, 0x48)[0]从 GPT 头偏移 0x48 读取分区表起始 LBA。struct.unpack_from('<I', hdr, 0x54)[0]读取每个分区项的大小,规范规定为 128 字节。parse_guid(blob[0:16])把磁盘上的小端混合 GUID 字节转成标准字符串格式。blob[56:128].decode('utf-16-le', 'replace')分区名是 UTF-16LE 编码,从偏移 56 开始共 72 字节。if blob == b'\x00' * psize:全零的分区项表示未使用,直接跳过。tag = 'ESP ' if guid == ESP_GUID else ' '用 ESP 的 Type GUID 精确匹配系统分区。
常见误区
误区新手总以为换成 GPT 分区表就只能在 UEFI 机器上用了,在 BIOS 上插上这块硬盘系统会直接认不出。
正解GPT 在 LBA0 保留了保护性 MBR 扇区,老式 BIOS 磁盘工具看到的是一个「伪 MBR」分区,因此不会误以为整块磁盘为空。传统 BIOS 确实无法从 GPT 分区引导系统,但读取大容量 GPT 磁盘上的数据是可行的——只是引导链路仍是 MBR 那套。UEFI+GPT 是最佳组合,但不是强制绑定。
为何常见:因为市面上几乎所有预装系统的 GPT 磁盘都配合 UEFI 使用,让人误以为二者完全绑死。
误区很多人以为开机按 F12 或看到的「选择操作系统」图形菜单就是 UEFI 自带的界面。
正解按 F12 弹出的通常是固件自身的启动管理器菜单(列出可启动设备),而 GRUB 的紫色菜单或 Windows 的「选择操作系统」蓝屏是引导加载程序自己画的。前者发生在 BDS 阶段,后者发生在 TSL 阶段,是两套完全不同的软件。
为何常见:两者都在内核启动前出现、都需要按键选择,外观差异让初学者容易混淆。
误区有人觉得 Secure Boot 是个可以随时关掉的「防病毒开关」,几乎没有任何副作用。
正解Secure Boot 是 UEFI 信任链的基石,关系到整机从固件到内核的完整性验证。关闭后,恶意引导程序(bootkit)可以在内核加载前植入。而盲目开启且没签名的驱动、内核或双系统引导文件会直接被拒。合理做法是保留默认的签名链,或把自己的密钥用 mokutil 导入。
为何常见:多数用户从未遇到过「开启后无法启动」的教训,于是把安全启动当成了可有可无的选项。
误区启动顺序换来换去很麻烦,系统装好后想改顺序,要么重启按 Del 进 BIOS,要么干脆重装系统。
正解启动顺序本质是 NVRAM 中的 BootOrder 变量。Linux 下一条 efibootmgr -o 0001,0000 就能重建顺序;Windows 下 bcdedit 也可以管理入口。固件设置界面只是它的图形化外壳,真正的工作发生在变量层面。
为何常见:图形界面最常见,命令行工具不普及,容易让人以为只有一种操作入口。
面试题
Q1. UEFI 启动协议中,负责选择启动设备并加载引导程序的是哪个阶段?
- A.SEC 验证阶段
- B.PEI 初始化阶段
- C.DXE 驱动阶段
- D.BDS 设备选择阶段← 正确答案
答案:D。BDS(Boot Device Selection)阶段由启动管理器根据 BootOrder 决定从哪个设备启动并加载引导程序。SEC 负责安全验证,PEI 初始化 CPU 与内存,DXE 加载驱动并枚举设备。
Q2. 下列哪个数据结构是 UEFI 提供给 OS Loader 的核心入口?
- A.EFI 系统表← 正确答案
- B.MBR 引导块
- C.全局描述符
- D.CMOS 配置区
答案:A。UEFI 通过 EFI System Table(gST)向 OS Loader 暴露厂商信息、控制台句柄、启动服务与运行时服务指针。MBR 引导块属于传统 BIOS 世界,全局描述符是 CPU 分页概念,CMOS 是硬件配置区。
Q3. UEFI 的 BootOrder NVRAM 变量中保存的内容是?
- A.引导程序源码文件
- B.有序的启动编号列表← 正确答案
- C.操作系统内核镜像
- D.分区表的备份副本
答案:B。BootOrder 是一个有序的 16 位 Boot#### 编号数组,表示启动项的优先级顺序。它不保存源码、内核镜像或分区表,只是「排班表」本身。
Q4. GPT 分区表默认最多可容纳多少个分区表项?
- A.32 个分区项
- B.64 个分区项
- C.128 个分区项← 正确答案
- D.256 个分区项
答案:C。GPT 默认用 32 个扇区存放分区项,每项 128 字节,因此 512×32÷128 = 128 个分区项。A 的 32 是扇区数,B 和 D 没有规范依据。
Q5. 安全启动 Secure Boot 中,DBX 数据库的作用是?
- A.保存平台密钥
- B.保存信任白名单
- C.保存吊销黑名单← 正确答案
- D.保存超时设置值
答案:C。DBX 是「失信名单」,记录已吊销的镜像摘要或证书;DB 是「信任白名单」,PK 是平台总密钥,KEK 是密钥交换密钥。四者共同构成 Secure Boot 门禁体系。
Q6. 引导程序调用哪个函数放弃启动服务、把控制权交给内核?
- A.加载镜像服务
- B.启动镜像服务
- C.退出启动服务← 正确答案
- D.系统重启服务
答案:C。ExitBootServices 是引导程序与内核交接的关键动作,调用后启动服务全部下线,内核接管硬件。LoadImage 负责加载镜像、StartImage 负责启动镜像、ResetSystem 是重启系统。
Q7. UEFI 状态码(EFI_STATUS)第 63 位为 1 时,表示该状态属于哪一类?
- A.成功状态
- B.保留状态
- C.异常状态← 正确答案
- D.未定义状态
答案:C。EFI_STATUS 的第 63 位是严重度标记,置 1 表示出错或警告,置 0 表示成功。排错时先看这一位,就能快速判断固件服务调用是否成功。
Q8. 下面哪些属于 UEFI 相对于传统 BIOS 的改进?
- A.支持 64 位大磁盘寻址← 正确答案
- B.模块化驱动与协议抽象← 正确答案
- C.必须使用汇编编写固件
- D.提供安全启动机制← 正确答案
答案:ABD。UEFI 用 64 位架构与 GPT 支持大磁盘,用 Protocol 实现模块化驱动,并提供 Secure Boot 安全启动。C 恰恰相反,UEFI 固件主要用 C 语言编写。
Q9. 下列关于 ESP(EFI System Partition)的说法正确的是?
- A.通常格式化为 FAT32← 正确答案
- B.存放引导程序的 .efi 文件← 正确答案
- C.必须分配盘符才能引导
- D.由 GPT 类型 GUID 标识← 正确答案
答案:ABD。ESP 是格式化为 FAT32 的 GPT 分区,存放 grubx64.efi、bootmgfw.efi 等引导文件,通过固定的类型 GUID 标识。C 错误——引导不依赖盘符,Windows 下的盘符只是挂载视图。
Q10. 以下哪些是导致 UEFI 启动失败的常见原因?
- A.安全启动拒签未签名内核← 正确答案
- B.启动项指向不存在的设备← 正确答案
- C.ESP 文件系统损坏← 正确答案
- D.CPU 主频设置过高
答案:ABC。Secure Boot 拒签、BootOrder 指向失效设备、ESP 分区损坏都是 UEFI 启动失败的典型根因。D 属于硬件稳定性问题,与 UEFI 启动协议链路无关。