惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
A
About on SuperTechFans
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
月光博客
月光博客
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
Jina AI
Jina AI
有赞技术团队
有赞技术团队
博客园_首页

博客园 - yooooooo

I3C协议Single Data Rate(SDR)模式研读(一):总线配置Bus Configuration I3C总线技术概述(二) I3C 总线技术概述(一) PCIe扫盲——物理层逻辑部分基础(三) PCIe扫盲——Ack Nak 机制详解(二) PCIE 的 per-vector masking ftraceoption irq-info MPAM BE/ FE 的区别及功能 IPI与CPU唤醒机制 【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】 ARM CoreLink 系列 4.3 -- NI-700 Component and interface identifiers ARM CCI-500 与 NI0700 的关系. ARM NIC-400 与 NI-700 的区别 claude code命令使用 【ARM Trace32(劳特巴赫) 使用介绍 2.2 -- TRACE32 进阶命令之 DIAG 弹框命令】 trace32 .cmm脚本和.t32文件的区别 【ARM Trace32(劳特巴赫) 使用介绍 2.1 -- TRACE32 Practice 脚本 cmm 脚本学习】 【ARM Trace32(劳特巴赫) 使用介绍 1.1 - Veloce 环境中使用trace32 连接 Cortex-M33】 PCIe 总线的 ASPM 和 链路状态机制总结 fw_devlink 功能 I3C协议详解 UART 协议规范 BPF 调度器 sched_ext 实现机制、调度流程及样例 Android Camera性能分析 录像Buffer Path详解 【UEFI基础】Protocol介绍 【UEFI实战】在库中使用全局变量 sched feature TTWU_QUEUE 【ARM CoreLink 系列 4.2 -- NI-700 Function units 详细介绍】 edk2构建编译流程 UEFI:FDF文件及FD、FV、FFS
UEFI Boot Manager
yooooooo · 2025-11-12 · via 博客园 - yooooooo

简介

UEFI boot manager是一个固件方针引擎,它可以通过修改global NVRAM 变量来配置;它会按照global NVRAM variable 定义的顺序来加载UEFI driver or UEFI application。当固件初始化完成,就会把控制权交给boot manager,boot manager然后来负责决定加载。

UEFI包含启动顺序内容如下:

  1. 从globa NVRAM 变量中读取boot order list,修改这个变量在下一次reset后生效;boot order list定义了一个NVRAM 顺序变量表,包含了启动的信息;每一个NVRAM 变量定义了启动选项的名称;
  2. NVRAM 变量也包含指向硬件设备及其文件的指针,包含要加载的UEFI image
  3. 变量还要包含操作系统分区和目录的路径以及其他配置特定目录

一. 相关Global variables

1

NVRAM中每个变量名为Boot####,####十六进制数;BootOrder 定义了启动顺序,其中值为####;BootNext 定义了下一次启动的第一启动项,它与BootCurrent的数据均为####。

二.Variable数据结构

利用Getvariable()获取NVRAM中load option信息,Setvariable()则可以改变信息,变量名为“Boot####”,数据结构为EFI_LOAD_OPTION。

2

EFI_LOAD_OPTION:

typedef struct _EFI_LOAD_OPTION {
UINT32 Attributes;
UINT16 FilePathListLength;
// CHAR16 Description[];
// EFI_DEVICE_PATH_PROTOCOL FilePathList[];
// UINT8 OptionalData[];
} EFI_LOAD_OPTION;

Attributes: 即option属性,如果一个option mark as Active,boot manager 会尝试从此设备路径boot,这样就可以简单的进行enable/disable boot option;

如果属性为Hidden,那么option会隐藏

3

FilePathListLength:表示后面FilePathList 数据长度

Description:用户可看的load option描述,一般就是我们可以看到的boot 设备名称,以“0000”结尾

FilePathList:可以看到其结构为EFI_DEVICE_PATH_PROTOCOL,因此是一组UEFI device path 数组,第一个路径元素来描述设备和这个load option image的位置

4

OptionalData[]:预留数据区

三. 启动机制

EFI 可以从一个支持EFI_SIMPLE_FILE_SYSTEM_PROTOCOL 或者 EFI_LOAD_FILE_PROTOCOL 的设备启动。如果一个设备支持EFI_SIMPLE_FILE_SYSTEM_PROTOCOL,它必须实现文件系统协议,才能可启动;如果一个设备不想支持完整的文件系统,它可能会产生一个EFI_LOAD_FILE_PROTOCOL,用于直接启动镜像;Boot Manager 会尝试先用EFI_SIMPLE_FILE_SYSTEM_PROTOCOL启动,如果fail,会再用EFI_LOAD_FILE_PROTOCOL。

一般HDD,USB等Media设备采取file system 模式boot,它们的FilePath 中包含了file name 以及boot image。当一个设备没有完整的file system,它会加载EFI_LOAD_FILE_PROTOCOL来使boot image具体化,Network device一般用这种模式boot 因为它的boot image 不需要file system。