文章目录
Boot Manager
UEFI Boot Manager是一个固件策略引擎,Boot Manager按照全局NVRAM变量定义的顺序加载UEFI drivers程序和UEFI applications程序(包括UEFI OS boot loaders)。
1.boot order list 定义了一个NVRAM变量列表,其中包含关于要引导的内容的信息。
2.每个NVRAM变量为可以显示给用户的启动选项定义了一个名称。
3.该变量还包含一个指向硬件设备和硬件设备上包含要加载的UEFI映像的文件的指针。
4.该变量还可能包含到OS分区和目录的路径,以及其他特定于配置的目录。
一、Firmware Boot Manager
1. Boot Manager 设计
因为boot manager是从nvram里面获取的启动项列表,所以可以通过Setvariable()修改。
每个加载选项条目都位于Boot####、Driver####、SysPrep####、OsRecovery####或PlatformRecovery####变量中,其中####由一个可打印的十六进制数字(0-9)和字符a - f的大写版本替换(0000-FFFF)。
DriverOrder是Driver####加载顺序。BootOrder是Boot####加载顺序。
可以通过添加、删除或修改Boot####去操作新的引导选项,BootOrder也会更新顺序。
Boot manager会根据BootOrder顺序去load启动项,如果load失败,则按顺序load下一个,如果返回EFI_SUCCESS则load进启动项。
Secure Boot会影响Boot manager行为。
2. Load Option 流程
Boot manager需要在启动加载选项项之前处理驱动程序加载选项项。
如果在osindicators中设置了EFI_OS_INDICATIONS_START_OS_RECOVERY位,则固件将尝试操作系统定义的恢复(参见3.4.1节),而不是正常的启动处理。如果在osindicators中设置了EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY位,固件将尝试平台定义的恢复(见3.4.2节),而不是正常的引导处理EFI_OS_INDICATIONS_START_OS_RECOVERY位的处理。在任何一种情况下,两个比特都应该被清除。
Boot manager会先引导BootNext启动项,引导失败才会使用BootOrder列表,在将控制转移到预选的引导选项之前删除BootNext。
Boot manager如果LoadImage()成功,在StartImage()之前,必须先使用EFI_BOOT_SERVICES. setwatchdogtimer()启动看门狗定时器,启动时间为5分钟。如果引导选项将控制返回给引导管理器,则引导管理器必须通过额外调用SetWatchdogTimer()引导服务来禁用看门狗定时器。
UEFI引导管理器支持USB WWID或USB Class设备路径,硬盘介质设备路径,File path Media device path,URI设备路径。
3. Load Options
每个Load Options variable包含一个EFI_LOAD_OPTION描述符。
typedef struct _EFI_LOAD_OPTION {
UINT32 Attributes;
UINT16 FilePathListLength;
// CHAR16 Description[];
// EFI_DEVICE_PATH_PROTOCOL FilePathList[];
// UINT8 OptionalData[];
} EFI_LOAD_OPTION;
4. Boot Manager 功能
define | value | 描述 |
---|---|---|
EFI_BOOT_OPTION_SUPPORT_KEY | 0x00000001 | 支持按键启动 |
EFI_BOOT_OPTION_SUPPORT_APP | 0x00000002 | 详见spec |
EFI_BOOT_OPTION_SUPPORT_SYSPREP | 0x00000010 | 支持SysPrep####形式启动 |
EFI_BOOT_OPTION_SUPPORT_COUNT | 0x00000300 | 按键启动最大次数 |
EFI_BOOT_OPTION_SUPPORT_APP可以创建单独的Boot ####。
EFI_BOOT_OPTION_SUPPORT_KEY 设置之后可以设置热键,匹配Key####来使用热键启动启动项。
SysPrep####指定UEFI应用程序,该应用程序需要执行,以便在处理任何Boot####变量之前完成系统准备。SysPrep####应用程序的执行顺序由变量SysPrepOrder的内容决定。
所有SysPrep####变量启动并退出后,平台通知EFI_EVENT_GROUP_READY_TO_BOOT和EFI_EVENT_GROUP_AFTER_READY_TO_BOOT事件组,并根据BootOrder定义的顺序开始对属性设置为LOAD_OPTION_CATEGORY_BOOT的Boot####变量进行求值。标记为LOAD_OPTION_CATEGORY_BOOT的变量的FilePathList在EFI_EVENT_GROUP_AFTER_READY_TO_BOOT事件组处理完成之前不被评估。
二、Boot Manager Policy Protocol
EFI_BOOT_MANAGER_POLICY_PROTOCOL
struct _EFI_BOOT_MANAGER_POLICY_PROTOCOL {
UINT64 Revision;
EFI_BOOT_MANAGER_POLICY_CONNECT_DEVICE_PATH ConnectDevicePath;
EFI_BOOT_MANAGER_POLICY_CONNECT_DEVICE_CLASS ConnectDeviceClass;
};
三、Globally Defined Variables
定义了一些全局变量供开发者使用:
全局变量 | 意义 |
---|---|
Boot#### | 启动项 |
BootCurrent | 当前启动项 |
BootNext | 下次启动启动项 |
ConIn | 默认输入控制台设备路径 |
更多可使用变量请查看spec
四、Boot Option 恢复
启动选项失败恢复机制
五、Boot 机制
1.使用EFI_SIMPLE_FILE_SYSTEM_PROTOCOL 或者EFI_LOAD_FILE_PROTOCOL启动
总结
后续有更深理解,会继续补充。
学艺不精,错误请指正;
如有侵权,请联系删除。
参考文档: 《UEFI_Spec_2_9_2021_03_18》