UEFI 是平台固件与操作系统之间的固件接口。UEFI Forum 发布 UEFI 和 平台初始化(Platform Initialization,PI)规范;EDK II 是 TianoCore 的参考实现和构建环境。
启动阶段 #
PI 架构将早期固件执行划分为多个阶段。预 EFI 初始化 (Pre-EFI Initialization,PEI)开始时,除 CPU 和临时存储外几乎没有 其他资源。PEI Foundation 运行 PEI 模块(PEIM),发布 PPI (PEIM 间接口),并使用切换块(HOB)描述已发现的资源。其核心任务是 初始化足够的 RAM,以供下一阶段使用。
随后,驱动执行环境(Driver Execution Environment,DXE)从固件卷加载
驱动程序和服务,安装 UEFI 协议,并构建 UEFI 系统表。启动设备选择阶段
选择并加载操作系统启动选项。执行 ExitBootServices 后,操作系统接管
正常启动阶段的硬件资源;仅当平台支持时,UEFI 运行时服务仍然可用。
ACPI 表向操作系统描述硬件和电源管理接口。
固件映像 #
闪存设备(FD)是物理或逻辑固件映像。它包含一个或多个固件卷(FV); 固件卷是格式化容器,通常使用固件文件系统(FFS)。FFS 文件封装可执行 段、原始数据、压缩段和其他固件内容。FDF 文件描述如何将这些组成部分 构建为 FFS 文件、FV、更新胶囊、选项 ROM,并最终构建为 FD 映像。
大多数模块都可重定位,并会加载到 RAM 中。原地执行模块针对固定 ROM 地址进行链接,可直接从闪存运行;部分模块同时支持两种模式。
EDK II 元数据与构建流程 #
EDK II 包使用多种声明式文件:
.dec包声明发布 GUID、协议、库类和包含路径。.inf模块信息文件描述模块的源文件、依赖项、库类、包和构建选项。 它可以描述源代码、二进制或混合内容;构建过程会为源代码模块生成 AsBuilt INF。.dsc平台描述文件选择组件、库实例、工具链设置和平台级配置。.dsc.inc文件用于提取共享片段。.fdf闪存定义文件规划最终固件映像的布局。
BaseTools 读取这些元数据,解析库,并生成 AutoGen.c 和 AutoGen.h。
选定的工具链编译源文件,并将库对象归档。链接器生成中间映像,即使在
非 Windows 主机上也常命名为 .dll。GenFw 将其转换为 PE/COFF EFI
映像(.efi),并设置适当的 EFI 子系统,例如 EFI 启动服务驱动程序。
随后,模块会被封装到 FFS 文件、FV 和最终的 FD 映像中。
人机交互基础设施(Human Interface Infrastructure,HII)是面向用户的 固件资源的统称,包括字符串、字体、图像和设置表单(IFR)数据库。
迁移的参考资料 #
EFISTUB 是 Linux 内核的一项功能,它允许直接将 vmlinux 作为 EFI 应用程序调用,从而无需使用 GRUB2 等引导加载程序。
首先,检查内核是否已启用 EFISTUB:
zgrep 'CONFIG_EFI_STUB' /proc/config.gz然后,通过以下命令创建新的 UEFI 启动项:
efibootmgr --create
--disk ... # device node e.g. /dev/sdX
--part ... # partition number
--label ... # Entry Nickname
--loader '/vmlinuz-linux' # the executable path under the given partition
--unicode # interpret the following string in UCS-2 as argument to the EFI application, in our case, the kernel
'root=UUID=01a40dd8-28f0-4636-be1e-aeed60c98095 resume=UUID=2d877d5d-4ca1-4d46-a3d6-b6ee94cbbd78 rw rootflags=subvol=@ loglevel=3 quiet initrd=\initramfs-linux-lts.img' # kernel argumentsefibootmgr 由 efibootmgr 包提供;请查看所用发行版的包管理器或访问 https://github.com/rhboot/efibootmgr。
评论
在 GitHub 上阅读或评论(发表评论需要登录)