How to Write a simple UEFI EDKII Application:如何編寫一個UEFI簡單的應用程序[5]

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 ApplicationGetting Started Writing Simple Application (寫一個簡單UEFI應用程序例程)

      ->5.0 EDKII Project Introduction

      ->5.1 Setup build shell environmentRun the edksetup

      ->5.2 Modify Conf FilesEdit 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文件。在WindowsVSVisual Studio)通常要建立源文件和工程文件。在EDKII環境下,EDKII工程模塊由源文件(C或其源他文件)和工程文件(INF文件)。INF文件與VS的工程文件LinuxMakefile文件功能相同,用於自動化編譯源代碼。包相當於VS中的項目,des文件相當於VS中的sln文件;模塊相當於VS項目中的工程,INF文件相當於VS工程中的proj文件。 

一個簡單的UEFI標準應用程序工程模塊包含一個C程序源文件以及一個工程文件。接下來以簡單UEFI EDKII應用程序MyHelloWorld 爲例學習UEFI標準應用程序工程的框架和編寫流程。

5.1 Setup build shell environmentRun 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簡單的應用程序模塊MyHelloWorldC源文件//INF工程文件源碼/簡析[6]》。

5.3.3 Create MyHelloWorld.inf file in the project directory 

參看下一篇博文《UEFI簡單的應用程序模塊MyHelloWorldC源文件//INF工程文件源碼/簡析[6]》。

5.4 Build your UEFI Application

源文件和工程文件都已經編寫完成,下面編譯和運行這個標準應用程序工程模塊。需要將MyHelloWorld.inf添加到Nt32Pkg.dscEmulatorPkg.dsc[Components]部分,如下

[Components]
 MyHelloWorld/MyHelloWorld.inf

[注:路徑相對於EDKII根目錄]

具體模擬器配置編譯流程參看上一篇博文《Build/Launch EDKII emulator in Windows and Linux:編譯/運行WindowsLinux環境下EDKII模擬器[4]》。

WindowsNt32編譯採用:

D:\edk2> build

如果模擬器Nt32之前編譯過,可以只編譯MyHelloWorld模塊:

D:\edk2> build -m MyHelloWorld\MyHelloWorld.inf

LinuxEmulator編譯採用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 ShellEDKII默認將目錄:

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 ShellEDKII默認將目錄:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章