這篇文章主要用來記錄學習 UEFI EDKII 的心路歷程,由於非該領域的專業,因此難免會有錯誤。
以下介紹提供在windows環境或是Linux環境中的安裝與操作方式
如有發現錯誤,還請大家踴躍指正
在 Linux 中(Fedora 41)開發 UEFI EDKII
由於大部分的教程都是在 Windows 或是 Ubuntu 環境,所以這邊特意使用 Fedora/ Red Hat 來做開發。
首先進行環境配置,安裝依賴的套件:
# 這會安裝開發C/C++工具所需的套件集合
dnf group install -y development-tools
# 以下是執行edkII 所需要的套件
dnf install nasm libXext-devel \
libX11-devel uuid-devel \
gcc-c++ libuuid-devel acpica-tools
下載官方鏡像原始程式碼:
$ mkdir UEFI; cd UEFI
UEFI$ git clone https://github.com/tianocore/edk2.git
UEFI$ cd edk2
UEFI/edk2$ git submodule update --init
編譯EDKII工具鍊:
UEFI/edk2$ make -C BaseTools
UEFI/edk2$ source edksetup.sh
第一次執行 source edksetup.sh 會在 Conf目錄生成 tools_def.txt、target.txt、build_rule.txt 檔案,這是之後 build 指令會預設讀取的資訊
build 指令也是 edk2 用來編譯 package 的命令腳本,路徑會在剛剛編譯的 BaseTools 下:
edk2/BaseTools/BinWrappers/PosixLike/build
編譯 EDKII Packages
在 EDKII 中,編譯工作都是使用 build script 來完成
build 命令有幾個常用的選項可供配置:
- -a TARGETARCH or –arch=TARGETARCH: 該選項用於指定目標的指令及架構,常見的有 IA32(X86)、X64(AMD64, X86_64)、ARM、RISCV64
- -p PLATFORMFILE or –platform=PLATFORMFILE: 建構由 DSC 檔案名稱參數指定的平台,覆蓋 target.txt 的 ACTIVE_PLATFORM 定義
- -m MODULEFILE or –module=MODULEFILE: 建構由 INF 檔案名稱參數指定的模組,如果未提供該選項,預設會編譯 package 中的所有 Module
- -t TOOLCHAIN or –tagname=TOOLCHAIN: 使用工具鏈標記名建構平台,覆蓋 target.txt 的 TOOL_CHAIN_TAG 定義,在 windows 環境中通常是 VS2015,Linux 中則使用 GCC
- -b BUILDTARGET or –buildtarget=BUILDTARGET: 使用 TARGET 建置平台,覆蓋 target.txt 的 TARGET 定義,常用的有 RELEASE 或是 DEBUG
在 edk2 Module 中,模擬器是常用的工具,編譯該工具的方式如下:
# 在該命令中我們沒有使用 -m 指定要編譯的 Module
# 因此會將 EmulatorPkg 中的所有 Module 都編譯
UEFI/edk2$ build -p EmulatorPkg/EmulatorPkg.dsc -t GCC -a X64
編譯完成之後會在下命令的該目錄之下,出現一個 Build 目錄,這裡面會有以我們編譯的 Package 為名稱的目錄。
以剛剛編譯的模擬器工具為例,如下:
UEFI/edk2/Build$ ls
EmulatorX64/
# 進入 EmulatorX64 目錄後我們可以看到 DEBUG_GCC 目錄
# 雖然我們沒有使用 -b 來指定目標,但預設會是DEBUG,GCC表示 -t 指定的 toolchain
要執行虛擬機只需執行 Host,他會在剛剛編譯的套件路徑之下中,以下是執行後的範例:
可以看到很多 efi 執行檔,我們隨意執行一個 HelloWorld.efi 後即可得到結果。
OVMF 開放虛擬機器韌體
OVMF 是基於 EDKII 的韌體,可以在 qemu x86-64 虛擬機器下運作。這樣可以輕鬆地使用 UEFI 韌體進行調試和實驗
# 在該命令中我們沒有使用 -m 指定要編譯的 Module
# 因此會將 OvmfPkg 中的所有 Module 都編譯
UEFI/edk2$ build -p OvmfPkg/OvmfPkgX64.dsc -t GCC -a X64 -b RELEASE
# 編完的檔案放在 Build/{Platform Name}/{TARGET}_{TOOL_CHAIN_TAG}/FV
UEFI/edk2/Build/OvmfX64/RELEASE_GCC/FV$ ls -alh OVMF*
-rw-r--r--. 1 alan alan 3.5M Jan 2 17:07 OVMF_CODE.fd
-rw-r--r--. 1 alan alan 4.0M Jan 2 17:07 OVMF.fd
-rw-r--r--. 1 alan alan 528K Jan 2 17:07 OVMF_VARS.fd
OVMF 韌體(QEMU 的 UEFI 實作)分為兩個檔案:
- OVMF_CODE.fd 包含實際的 UEFI 韌體
- OVMF_VARS.fd 是用於模擬持久 NVRAM 儲存的「模板」
有 OVMF 後我們就可以使用 qemu 模擬器來執行。
$ qemu-system-x86_64 -s -pflash OVMF.fd -hda fat:rw:<efi_file_loc>\
-net none -debugcon file:debug.log -global -isa-debugcon.iobase=0x402 -nographic
執行之後,debug 的相關訊息會輸出到 debug.log
可以使用qemu搭配gdb進行除錯
常用工具
這邊介紹一些常使用的工具:
intel udk debugger tool
這裡存放除錯工具與使用手冊