the 2nd edition: 20150318
the 3rd edition: 20160314
在讀過《UEFI 原理与编程》後, 我終於有點概念了怎麼開發 uefi 程式。 需要對 .dsc, .dec, .inf 有點概念, 《UEFI 原理与编程》第三章在講這個, 請自行參閱, 書上有的東西我就不重複了。
env:
- linux/debian
- X64
- gcc
安裝所需要的開發套件:
apt-get install build-essential subversion uuid-dev iasl nasm
要先搞定 edk2, 這是 uefi 開發工具。
git clone https://github.com/tianocore/edk2.git
編譯 edk2 工具:
make -C BaseTools/
設定環境變數
. edksetup.sh
修改 Conf/target.txt
TARGET_ARCH = X64
TOOL_CHAIN_TAG = GCC49
雖然我選的是 GCC49, 不過其實我系統中的 gcc 是 5.3。
開始編譯 edk2 的程式
build -p OvmfPkg/OvmfPkgX64.dsc
build -p MdeModulePkg/MdeModulePkg.dsc
build -p AppPkg/AppPkg.dsc
build 相當於 make, 啟動後就會開始一系列的 gcc/ld 命令。
編譯出來的檔案在
edk2/Build
ex:
Build/OvmfX64/DEBUG_GCC49/FV/OVMF.fd
這個可以用 qemu 來跑, 模擬 uefi。
qemu-system-x86_64 -fda dos622.img -bios OVMF.fd
MdeModulePkg 裡頭有個 Hello.efi 可以測試, AppPkg 有個 Main.efi 則是以 main 來寫 uefi 程式的範例。
把這兩個檔案複製到 dos622.img, 用 qemu-system-x86_64 -fda dos622.img -bios OVMF.fd 來測試。
Main.efi source code: edk2/MdeModulePkg/Application/HelloWorld/HelloWorld.c
Hello.efi: edk2/AppPkg/Applications/Hello/Hello.c
Main.efi: edk2/AppPkg/Applications/Main/Main.c
AppPkg obj 檔則是在
Build/AppPkg/DEBUG_GCC49/X64/StdLib/LibC/LibC/OUTPUT/
ex:
Build/AppPkg/DEBUG_GCC49/X64/StdLib/LibC/LibC/OUTPUT/Main/Main.obj
source code 檔案都告知了, 可以自行參閱, 不過還需要知道各種 uefi 程式種類, 一樣在《UEFI 原理与编程》。
ref:
------ 以下舊文, 參考用 -----
找 uefi qemu 相關資料好久了, 都沒看到合用的, 不是太舊就是不知道在說什麼。
juluosdev Ben 找到了一篇教學文。
https://wiki.ubuntu.com/UEFI-
和文章有點不同, 我沒有編出這個 vgabios-cirrus.bin, 不過 uefi shell 還是有成功運作。
$ qemu-system-x86_64 -L . -hda fat:hda-contents
寄件者 write_os |
手邊沒有真實機器可以測試, 只能在 qemu 練習, 慘了 bootloader 程式要重新來過了。自己切換保護模式的樂趣沒了, 沒記錯的話, uefi 應該已經處於保護模式了。
ubuntu 12.04 可以從 uefi 開機, 我試過 debian iso 是無法從 uefi 開機的。201503 的 debian iso (testing amd64) 光碟可以從 qemu 模擬器開機, 不過我在真實機器卻無法使用 uefi 開機。debian jessie (8.0) amd64 iso 則可以正常由 uefi 開機。
ref: http://www.rodsbooks.com/efi-
版主你好 請問dos622.img 這個要怎麼製作
回覆刪除你可以試試 freedos, http://www.freedos.org/download/
刪除