统一可扩展固件接口 (UEFI)

UEFI,即统一可扩展固件接口,是一项管理兼容固件接口行为的规范。它由 UEFI 论坛维护 - http://www.uefi.org/

UEFI 是其前身“EFI”的演进版本,因此在本文档和相关的源代码中,EFI 和 UEFI 这两个术语可以互换使用。通常规则是,任何新的内容都使用“UEFI”,而“EFI”则指代遗留代码或规范。

Linux 中的 UEFI 支持

在符合 UEFI 规范的固件平台上引导,使得内核能够支持额外的功能

  • UEFI 运行时服务 (Runtime Services)

  • 通过 UEFI 配置表的标准化接口获取各种配置信息。(ACPI,SMBIOS,……)

要实际启用 [U]EFI 支持,请启用

  • CONFIG_EFI=y

  • CONFIG_EFIVAR_FS=y 或 m

该实现依赖于在扁平设备树 (Flattened Device Tree, FDT) 中接收有关 UEFI 环境的信息 - 因此仅在配置了 CONFIG_OF 时可用。

UEFI 存根 (stub)

“存根 (stub)”是一项将 Image/zImage 扩展为有效的 UEFI PE/COFF 可执行文件的功能,它包含一个加载程序,使得可以直接从 UEFI shell、启动菜单或 Gummiboot 或 rEFInd 等轻量级引导加载程序中加载内核。

带有存根支持构建的内核映像在非 UEFI 环境中引导时,仍然是一个有效的内核映像。

ARM 上的 UEFI 内核支持

ARM 架构(arm 和 arm64)上的 UEFI 内核支持仅在通过存根执行引导时才可用。

在 UEFI 模式下引导时,存根会删除所提供 DT 中的任何内存节点。相反,内核会读取 UEFI 内存映射。

存根在 FDT 的 /chosen 节点中填充(内核会扫描这些参数)以下参数

名称

类型(Type)

描述

linux,uefi-system-table

64 位

UEFI 系统表的物理地址。

linux,uefi-mmap-start

64 位

UEFI 内存映射的物理地址,由 UEFI GetMemoryMap() 调用填充。

linux,uefi-mmap-size

32 位

前一项中指向的 UEFI 内存映射的大小(以字节为单位)。

linux,uefi-mmap-desc-size

32 位

UEFI 内存映射中每个条目的大小(以字节为单位)。

linux,uefi-mmap-desc-ver

32 位

mmap 描述符格式的版本。

kaslr-seed

64 位

用于随机化内核映像基地址位置的熵。

bootargs

字符串

内核命令行