2015年3月18日 星期三

uefi with qemu

the 1st edition: 20121102
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-howto

和文章有點不同, 我沒有編出這個 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-bootloaders/




2 則留言:

  1. 版主你好 請問dos622.img 這個要怎麼製作

    回覆刪除
    回覆
    1. 你可以試試 freedos, http://www.freedos.org/download/

      刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。