UEFI 与 EDK II

最后更新: 2022-04-13 08:27:02 +0800 +0800
tags: Edk-Ii | Firmware | Uefi
原文以英文撰写。您正在阅读AI翻译版本。

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:

sh
zgrep 'CONFIG_EFI_STUB' /proc/config.gz

然后,通过以下命令创建新的 UEFI 启动项:

sh
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 arguments

efibootmgr 由 efibootmgr 包提供;请查看所用发行版的包管理器或访问 https://github.com/rhboot/efibootmgr。

评论

在 GitHub 上阅读或评论(发表评论需要登录)