How to Write a simple UEFI EDKII Application:如何編寫一個UEFI簡單的應用程序[5]
2015-07 北京海淀區 張俊浩
本篇博文《How to Write a simple UEFI EDK II Application:如何編寫一個UEFI簡單的應用程序[5]》是基於之前的UEFI博文在之前的EDKII開發環境搭建、配置/編譯EDKII工程、運行EDKII模擬器的基礎上,也即在熟悉EDKII的編譯流程後,學習在EDKII環境下編程。
參看TianoCore官網(http://www.tianocore.org官網上Getting Started for Developers->Further Help-> Getting Started Writing Simple Application)和《UEFI原理與編程》第三章UEFI工程模塊文件。本篇博文框架:
5. How to Write a simple UEFI EDKII Application:Getting Started Writing Simple Application (寫一個簡單UEFI應用程序例程)
->5.0 EDKII Project Introduction
->5.1 Setup build shell environment:Run the edksetup
->5.2 Modify Conf Files:Edit the file conf/target.txt
->5.3 Create a project:MyHelloWorld
->5.3.1 Create a new directory.
->5.3.2 Create MyHelloWorld.c file in the project directory
->5.3.3 Create MyHelloWorld.inf file in the project directory
->5.4 Build your UEFI Application
->5.5 Run your UEFI Application
->5.5.1 Run Nt32 and UEFI Application
->5.5.2 Run Emulator and UEFI Application
5.0 EDKII Project Introduction
在EDKII根目錄下,有很多*Pkg命名的文件夾,每一個這樣的文件夾成爲一個包。當然,這樣說很不準確,準確的說“包”是一組平臺及平臺描述文件(.dsc文件,EDKII Platform Description File)、包聲明文件(.dec文件,EDKII Declaration File)組成的集合。
在Linux編程下,除了編寫源代碼之外,還要編寫Makefile文件。在Windows下VS(Visual Studio)通常要建立源文件和工程文件。在EDKII環境下,EDKII工程模塊由源文件(C或其源他文件)和工程文件(INF文件)。INF文件與VS的工程文件Linux的Makefile文件功能相同,用於自動化編譯源代碼。包相當於VS中的項目,des文件相當於VS中的sln文件;模塊相當於VS項目中的工程,INF文件相當於VS工程中的proj文件。
一個簡單的UEFI標準應用程序工程模塊包含一個C程序源文件以及一個工程文件。接下來以簡單UEFI EDKII應用程序MyHelloWorld 爲例學習UEFI標準應用程序工程的框架和編寫流程。
5.1 Setup build shell environment:Run the edksetup
Run edksetup script from the command line prompt at the Work Space directory
Windows Comand Prompt:
C:\edk2> edksetup.bat --nt32
Linux like:
bash$ . edksetup.sh BaseTools
5.2 Modify Conf Files
本步驟可以參考之前博文中配置EDKII項目流程
5.2.1 Set Build Target Information:配置target.txt文件
配置前模塊配置爲相應平臺的模擬器。
Windows:
ACTIVE_PLATFORM should look like this in Conf\target.txt:
ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc
Conf\target.txt其他配置採用之前的默認配置。
Linux:
ACTIVE_PLATFORM should look like this in Conf\target.txt:
ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc
Conf\target.txt其他配置採用之前的默認配置。
5.2.2 Check/Modify tools_def Information:檢查tools_def.txt確保編譯器路徑正確
之前的博客中環境EDKII項目編譯器路徑已經做了檢查。
5.3 Create a project
5.3.1 Create a new directory.(創建工作目錄)
Can be a directory anywhere within the Work Space Directory
本工程工作目錄路徑設置爲:
Windows:
D:\edk2> md MyHelloWorld
Linux:
linux@ubuntu:~$ mkdir ~/src/edk2/MyHelloWorld
5.3.2 Create MyHelloWorld.c file in the project directory
參看下一篇博文《UEFI簡單的應用程序模塊MyHelloWorld:C源文件//INF工程文件源碼/簡析[6]》。
5.3.3 Create MyHelloWorld.inf file in the project directory
參看下一篇博文《UEFI簡單的應用程序模塊MyHelloWorld:C源文件//INF工程文件源碼/簡析[6]》。
5.4 Build your UEFI Application
源文件和工程文件都已經編寫完成,下面編譯和運行這個標準應用程序工程模塊。需要將MyHelloWorld.inf添加到Nt32Pkg.dsc或EmulatorPkg.dsc的[Components]部分,如下
[Components]
MyHelloWorld/MyHelloWorld.inf
[注:路徑相對於EDKII根目錄]
具體模擬器配置編譯流程參看上一篇博文《Build/Launch EDKII emulator in Windows and Linux:編譯/運行Windows和Linux環境下EDKII模擬器[4]》。
Windows下Nt32編譯採用:
D:\edk2> build
如果模擬器Nt32之前編譯過,可以只編譯MyHelloWorld模塊:
D:\edk2> build -m MyHelloWorld\MyHelloWorld.inf
Linux下Emulator編譯採用EmulatorPkg/build.sh腳本的方式:
linux@ubuntu:~/src/edk2$ ./EmulatorPkg/build.sh -a IA32
這樣生成的MyHelloWorld.efi會存放在edk2/Build/Emulator32/DEBUG_GCC46/IA32路徑下。
通過“./EmulatorPkg/build.sh -a IA32 run”是將edk2/Build/Emulator32/DEBUG_GCC46/IA32/映射爲文件系統fsnt0。
如果模擬器Emulator之前編譯過,可以只編譯MyHelloWorld模塊:
linux@ubuntu:~/src/edk2$ ./EmulatorPkg/build.sh -m MyHelloWorld/MyHelloWorld.inf
[注:通過 ./EmulatorPkg/build.sh -a IA32編譯的模塊最終生成的.efi放在:
edk2/Build/Emulator32/DEBUG_GCC46/IA32路徑下;
通過build -a IA32編譯的模塊最終生成的.efi放在:
edk2/Build/Emulator/DEBUG_GCC46/IA32。兩者目錄不同]
5.5 Run your UEFI Application
5.5.1 Run Nt32 and UEFI Application
D:\edk2> build run
或者在build命令行指定平臺:[不過-a/-p平臺架構和目標平臺我們在target.txt中配置,作爲build默認選項參數]
D:\edk2> build -a IA32 -p Nt32Pkg/Nt32Pkg.dsc run
或者是執行edk2\Build\NT32IA32\DEBUG_VS2013x86\IA32\SecMain.exe可執行文件;
模擬器最終會進入UEFI Shell,EDKII默認將目錄:
edk2\Build\NT32IA32\DEBUG_VS2013x86\IA32\映射爲文件系統FS0,在shell中執行命令(FS0:/fs0:,大小寫均可)
Shell> fs0:
Shell將會打開FS0分區並將當前目錄切換到FS0分區的根目錄,可執行我們編寫的UEFI應用程序模塊MyHelloWorld.efi,向屏幕終端打印輸出字符串“Hello World from Junhao by EDKII!”。
FS0:\> MyHelloWorld.efi
5.5.2 Run Emulator and UEFI Application
通過運行EmulatorPkg下的腳本
$ EmulatorPkg/build.sh -a IA32 run
模擬器最終會進入UEFI Shell,EDKII默認將目錄:
edk2/Build/Emulator32/DEBUG_GCC46/IA32/映射爲文件系統fsnt0,在shell中執行命令(FSNT0:/fsnt0:,大小寫均可)
Shell> fsnt0:
Shell將會打開fsnt0分區並將當前目錄切換到fsnt0分區的根目錄,可執行我們編寫的UEFI應用程序模塊MyHelloWorld.efi,向屏幕終端打印輸出字符串“Hello World from Junhao by EDKII!”。
fsnt0:\> MyHelloWorld.efi