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-to-PEIM 介面),並 使用交接區塊(hand-off block,HOB)描述已發現的資源。其核心工作是 初始化足夠的 RAM,以供下一階段使用。

接著,驅動程式執行環境(Driver Execution Environment,DXE)會從韌體 磁碟區載入驅動程式與服務、安裝 UEFI 協定,並建立 UEFI 系統資料表。開機裝置 選擇程序會選取並載入作業系統開機選項。執行 ExitBootServices 後, 作業系統便擁有一般開機階段的硬體資源;UEFI 執行階段服務 僅在平台支援之處維持可用。ACPI 資料表向作業系統描述硬體 與電源管理介面。

韌體映像 #

快閃裝置(FD)是實體或邏輯韌體映像。其中包含一個或 多個韌體磁碟區(FV),也就是經過格式化的容器,通常使用 韌體檔案系統(Firmware File System,FFS)。FFS 檔案封裝可執行區段、原始資料、 壓縮區段與其他韌體內容。FDF 檔案描述如何將這些 內容組成 FFS 檔案、FV、更新膠囊、選項 ROM,最終形成 FD 映像。

大多數模組皆可重新定位,並會載入 RAM。就地執行模組則 針對固定 ROM 位址進行連結,可直接從快閃記憶體執行;部分模組同時支援 這兩種模式。

EDK II 中繼資料與建置流程 #

EDK II 套件使用數種宣告式檔案:

  • .dec 套件宣告會發布 GUID、協定、程式庫類別與 include 路徑。
  • .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 上閱讀或評論(發表評論需要登入)