目錄

UEFI EDK2 專案基礎了解

UEFI 規範歷史

根據 AI 了解一下最早歷史,1998 年 Intel 在開發全新的 64 位元 Itanium(IA-64)伺服器架構時,發現傳統 16 位元 BIOS 完全無法支援 64 位元架構的開機需求。Intel 工程師因此啟動了 SAL/EFI 專案,目標是用 C 語言打造全新、具備抽象化介面的現代化開機環境。

  1. 2002 - 2004 年,Intel 發布了 EFI 1.10 規格,並開始在 Itanium 伺服器以及部分 x86 平台上進行試驗。為了推動標準普及,Intel 在 2004 年將部分基礎程式碼以「TianoCore」之名開源,這也是 EDK / EDK2 的前身。
  2. 2005 年為了避免單一晶片巨頭壟斷標準,包括 Intel、AMD、Microsoft、Apple、HP、Dell、IBM、AMI、Insyde、Phoenix 等業界核心巨頭共同成立了非營利組織 Unified EFI Forum(UEFI Forum)。Intel 正式將 EFI 1.10 規格的擁有權轉交給該論壇,名稱也正式更名為 UEFI(Unified EFI)。
  3. 2006 - 2012 年 UEFI Forum 推出首個官方統一標準 UEFI 2.0。隨後 Apple 在 2006 年全面轉向 Intel 處理器時率先全面採用 EFI;Windows Vista / 7 開始引入 64 位元 UEFI 支援;到了 2012 年 Windows 8 強制要求 Secure Boot(安全開機),UEFI 正式全面取代傳統 BIOS 成為 PC 業界標準。
  4. 2013 年到現今,UEFI 接管了 ACPI 規範的維護工作,並將標準擴展到 ARM / AArch64、RISC-V 與 LoongArch 架構。現今伺服器、PC、嵌入式系統與部分車用晶片皆全面運行基於 UEFI / EDK2 架構的韌體。

內部主要小組:

  1. USWG (UEFI Specification WG) 負責核心 UEFI Specification 的修訂、新硬體協定定義與 API 擴充。
  2. PIWG (Platform Initialization WG) 負責 PI Specification,定義開機內部各階段(SEC/PEI/DXE/BDS)的架構規範。
  3. ASWG (ACPI Specification WG) 負責維護進階電源管理與硬體配置的 ACPI 規範(自 ACPI 5.0 後併入)。
  4. UTWG (UEFI Test WG) 負責開發與維護官方一致性測試套件 SCT(Self-Certification Test)。
  5. Security WG 專注於平台韌體安全、Secure Boot、憑證管理與抗攻擊標準。

相關文件像是:

  1. UEFI Specification(目前最新 2.10+ 版,2000 多頁的厚重 PDF)
  2. UEFI Platform Initialization (PI) Specification(Vol 1 ~ Vol 5)
  3. ACPI Specification(最新 6.5+ 版)
  4. UEFI Shell Specification

UEFI 生態圈組成

  1. 規範制定者(UEFI Forum):只寫「標準規範書」(PDF 文件),規範 API、表格結構與行為準則。
  2. 開源基礎設施(TianoCore / EDK2):在 BSD 授權下維護開源參考程式碼,由 Intel 與開源社群共同主導。
  3. 獨立韌體供應商(IBV):如 AMI(Aptio)、Insyde(InsydeH2O)、Phoenix 等,他們基於 EDK2 加上自家的圖形介面、管理功能與模組,授權給 OEM 廠商。
  4. 硬體與晶片廠(IHV / Silicon Vendor):如 Intel、AMD、Qualcomm,負責撰寫 CPU 與晶片組的驅動程式碼(Silicon Reference Code / MRC)。
  5. 系統製造商(OEM / ODM):如 ASUS、Dell、HP、廣達、緯創,將 IBV 核心與晶片廠程式碼整合,適配特定主機板電路並燒錄進 SPI Flash 晶片。

OVMF

OVMF 是基於 EDKII 的韌體,可以在 qemu x86-64 虛擬機器下運作。這樣可以輕鬆地使用 UEFI 韌體進行調試和實驗。

Tianocore

UEFI 有七個階段:

  1. SEC,通電第一步(Reset Vector)。記憶體(DRAM)尚未就緒,CPU 將自身的 Cache 模擬為暫存 RAM(Cache-as-RAM, CAR)建立 C 語言堆疊。
    1. 驗證下個階段(PEI 核心)的數位簽章,建立信任鏈(Root of Trust)。
  2. PEI,Pre-EFI Initialization,初始化 CPU 基本暫存器與晶片組。執行 記憶體訓練與初始化(MRC / DRAM Training)。透過 HOB(Hand-Off Block) 記錄記憶體配置資訊,準備交棒給下一階段。
  3. Driver Execution Environment,這時能用記憶體,啟動 DXE Dispatcher,依序載入數百個驅動程式(PCIe、NVMe、USB、GPU 等)。
    1. 註冊各種 Protocols,建立 ACPI Table 與 SMBIOS 表格。
  4. BDS,Boot Device Selection。根據 NVRAM 中的 BootOrder 變數決定開機順序。
    1. 顯示品牌 Logo、提供按鍵進入 BIOS Setup 選單,或自動載入 OS Bootloader(如 GRUB / Windows Boot Manager)。
  5. TSL,Transient System Load,執行開機引導程式(.efi)或 UEFI Shell。
    1. 系統仍可使用 UEFI Boot Services(如分配記憶體、讀寫檔案)。
  6. Run Time (RT),OS Bootloader 呼叫 ExitBootServices(),釋放開機暫存記憶體。
    1. 正式交由 OS 核心接管硬體,韌體僅保留少數 Runtime Services(如時間更新、寫入 NVRAM 變數)。
  7. AL(After Life),處理作業系統關機(S5)、重啟(Reset)或系統休眠/睡眠(S3/S4)的狀態轉換。

第一階段則是使用硬體晶片內建的「硬體信任根(Hardware Root of Trust)」來驗證,晶片出廠前就用微影製程直接「刻死」在 CPU / 晶片組內部的唯讀記憶體(Mask ROM)中,任何軟體或駭客都無法修改。

有些沒有鎖死 Intel Boot Guard 的強制驗證(或者採用寬鬆的認證模式,你就可以謝自己的 BIOS 了,你可以使用 SPI 燒錄器(如 CH341A)強行寫入自己修改過的 BIOS、客製化 Logo、甚至移植的 Coreboot。

Reference