作为 EFI stub 的 Qualcomm Linux 内核
EFI boot stub 是内置于内核镜像中的一个精简垫片(drivers/firmware/efi/libstub/),它满足 EFI 应用程序入口点约定。设置 CONFIG_EFI_STUB=y 后,内核镜像会被格式化为可移植可执行/通用对象文件格式(PE/COFF)二进制文件,使 UEFI 固件可以直接加载并执行它。
在 AArch64 上不支持压缩内核(zImage)。因此,内核镜像以未压缩的 Image 二进制形式发布,封装在 PE/COFF 容器中并链接了 EFI stub。
在当前的 defconfig 或运行中的系统上验证该配置:
EFI 系统分区(ESP)布局
ESP 是一个 FAT32 格式的分区,UEFI 固件和 systemd-boot 将其用作启动组件的共享存储。在 Qualcomm Linux 设备上,它以efi 分区(分区标签)的形式提供访问,其内容在 Yocto 构建期间被打包到可刷写的 efi.bin 镜像中。
目录结构
FAT32 要求
UEFI 规范要求 ESP 使用 FAT32 格式(较小的分区可使用 FAT12/16)。Yocto 的esp-qcom-image.bb 配方使用正确的 FAT32 参数创建 efi.bin 镜像。不要使用其他文件系统重新格式化 efi 分区,否则 UEFI 固件将无法挂载它。
统一内核镜像(UKI)结构
UKI 是一个带有额外 EFI 节(section)的 PE/COFF 二进制文件,这些节承载启动载荷。在 Qualcomm Linux 构建中,由ukify 嵌入的节包括:
Qualcomm Linux 的 UKI 将内核命令行存储在
.cmdline 中,这意味着命令行在镜像构建时就已固定。要更改内核参数,必须重新构建 efi.bin。有关开发期间的运行时覆盖,请参阅 efi-bin-append-update-kernel-cmdline-params skill 文档。
DTB 分区镜像(dtb.bin)
设备树 blob 维护在单独的分区(dtb_a)中,而不是嵌入到 UKI 中。这样无需重新构建内核镜像即可更新 DTB(例如添加新的单板覆盖)。
Yocto 构建会编译 KERNEL_DEVICETREE 中列出的所有设备树,并将它们打包到 dtb.bin 中,后者是一个 FIT 镜像,UEFI 固件会查询该镜像,为检测到的硬件选择正确的 DTB。基于 FIT 的选择机制在设备树架构中有详细描述。
构建产物摘要
下表将每个与启动相关的产物映射到其分区和作用:内核更改后更新 ESP
修改内核源码、配置或设备树后,重新构建并重新刷写efi.bin 和 dtb.bin:
内核或 DTS 更改后,务必同时刷写
efi.bin 和 dtb.bin。只刷写其中之一可能导致内核和设备树不同步,从而引起启动失败。
