UEFI BIOS tutorial

這篇文章主要用來記錄學習 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
這裡存放除錯工具與使用手冊

這篇文章在 HackMD 上也有分享,由於收到 优快云 很多貢獻,因此這邊也發表一篇 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值