本篇為UEFI實(shí)戰(zhàn)系列第一部分。
UEFI實(shí)戰(zhàn)前10個(gè)部分計(jì)劃如下:
UEFI 實(shí)戰(zhàn)(1) 開發(fā)環(huán)境
講述如何配置開發(fā)環(huán)境。
UEFI 實(shí)戰(zhàn)(2) HelloWorld
講述dsc, inf文件的格式, application常用的變量,數(shù)據(jù)結(jié)構(gòu)和函數(shù)。
UEFI 實(shí)戰(zhàn)(3) C++
講述如何用C++開發(fā)UEFI程序。
UEFI 實(shí)戰(zhàn)(4) protocol
講述UEFI中protocol的概念
UEFI實(shí)戰(zhàn)(5) driver
講述UEFI中driver模型
UEFI實(shí)戰(zhàn)(6) 文件讀寫
UEFI實(shí)戰(zhàn)(7) Hii interface 之 Form
UEFI實(shí)戰(zhàn)(8) Hii interface 之 String 和Font
UEFI實(shí)戰(zhàn)(9) GUI
UEFI實(shí)戰(zhàn)(10) Network
UEFI 實(shí)戰(zhàn)(1)
配置開發(fā)環(huán)境
3. 打開visual studio 2008 command prompt
cd EDK2
edksetup.bat
4. 編輯Conf\taget.txt, 修改 編譯工具TOOL_CHAIN_TAG 為
TOOL_CHAIN_TAG = VS2008x86
5. build
build命令有兩個(gè)參數(shù), -a 和-p, -a 用來(lái)選擇平臺(tái)(IA32 X64,...) -p用來(lái)選擇要編譯的package,默認(rèn)的package是Nt32Pkg, 所以build命令與 build -a IA32 -p Nt32Pkg\Nt32Pkg.dsc 等同,用來(lái)編譯UEFI模擬器。
6. build run
與build -a IA32 -p Nt32Pkg\Nt32Pkg.dsc run 命令等同,用來(lái)運(yùn)行UEFI模擬器。
制作UEFI USB啟動(dòng)盤
分兩種情況,如果目標(biāo)平臺(tái)是UEFI平臺(tái),按如下步驟來(lái)做:
1。 格式化U盤為FAT(FAT,FAT16, FAT32)格式
2。 在U盤上建立目錄 efi\boot
3。 將efi的應(yīng)用程序 copy到 efi\boot 目錄,并改名為bootx64.efi 或者bootia32.efi。
因?yàn)閁EFI的啟動(dòng)文件是FAT盤內(nèi)efi\boot目錄里的bootx64.efi 或bootia32.efi, 與legacy bios需要MBR來(lái)引導(dǎo)OS不同。
如果目標(biāo)平臺(tái)是legacy bios, 需要在U盤中制作MBR和引導(dǎo)文件, 按如下步驟來(lái)做:
1。 編譯duet package
build -a IA32 -p DuetPkg\DuetPkgIa32.dsc 或者
build -a X64 -p DuetPkg\DuetPkgX64.dsc
2。 生成引導(dǎo)文件
cd DuetPkg
postbuild.bat Ia32 或者 postbuild.bat X64
3。 插入U(xiǎn)盤,假設(shè)J:是U盤, 向U盤寫入MBR
createbootdisk usb J: FAT32 IA32 或者 createbootdisk usb J: FAT32 X64
4。拔出并重新插入U(xiǎn)盤, 向U盤copy UEFI文件
createbootdisk usb J: FAT32 IA32 step2 或者 createbootdisk usb J: FAT32 X64 step2
此命令向U盤根目錄copy了efildr20, 該文件用于引導(dǎo)系統(tǒng)進(jìn)入U(xiǎn)EFI環(huán)境,并向efi\boot目錄copy了引導(dǎo)文件bootia32.efi或bootx64.efi
接下來(lái)就可以用U盤來(lái)運(yùn)行UEFI了。
如何Debug
UEFI有兩種debug方式,一是在模擬環(huán)境Nt32Pkg下debug,另一種是通過(guò)串口調(diào)試真實(shí)環(huán)境中的UEFI程序。我從來(lái)沒見過(guò)傳說(shuō)中的利用串口調(diào)試,所以下面只能說(shuō)說(shuō)Nt32Pkg下的debug。
在需要調(diào)試的代碼前面加入_asm int 3; 編譯,然后再模擬環(huán)境中(Nt32Pkg)中運(yùn)行該程序,當(dāng)模擬器執(zhí)行到int 3;指令時(shí),會(huì)彈出對(duì)話框,然后就可以調(diào)試了。