1. 程式人生 > >UEFI原理與程式設計(四):UEFI工程模組檔案-使用main函式的應用程式工程模組

UEFI原理與程式設計(四):UEFI工程模組檔案-使用main函式的應用程式工程模組

UEFI工程模組檔案-使用mian函式的應用程式工程模組

前言

  標準應用程式工程模組Shell應用程式工程模組寫起來都是相對和我們平常使用的C/C++有些不同。EDK2提供了使用main函式的應用程式工程模組,我們可以結合StdLib就可以使用C標準庫中的函數了。這對於C語言程式設計師來說,mian函式就會熟悉很多。

一、原始檔(main 函式)

它寫起來就和我們寫C語言程式基本相同。

// 使用main函式的應用程式工程模組示例
#include <stdio.h>

int main(IN int Argc,IN char **Argv)
{
    printf("Hello World!\n"
); printf("Welcome to the world of EDK II.\n"); return(0); }

二、工程檔案

  1. 基本上和Shell應用程式模組相同,注意一下幾點。

    • [Defines]塊中的ENTRY_POINT需設為 ShellCEntryLib
    • [Packages]塊中列出 MdePkg/MdePkg.dec、ShellPkg/ShellPkg.dec、StdLib/StdLib.dec.
    • [LibraryClasses]塊中列出ShellCEntryLib、LibC、LibStdio
      注:ShellCEntryLib提供ShellCEntryLib函式;LibC提供ShellAppMain函式;LibStdio
  2. 使用main函式的應用程式工程模組工程檔案示例
[Defines]
INF_VERSION     = 0x00010006
BASE_NAME       = HelloWorld
FILE_GUID       = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE     = UEFI_APPLICATION
VERSION_STRING  = 1.0
ENTRY_POINT     = ShellCEntryLib

[Sources]
HelloWorld.c

[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
StdLib
/StdLib.dec [LibraryClasses] LibC LibStdio ShellCEntryLib [BuildOptions] MSFT:*_*_*_CC_FLAGS = /w

三、編譯執行

基本上和標準應用程式工程模組相同,我們可以將工程檔案相對於EDK2根目錄的路徑名新增到AppPkg.dsc [Components]裡。
執行下面的命令:

build -p AppPkg\AppPkg.dsc -m [工程檔案相對EDK2根目錄路徑名] -a IA32 (64位用:X64)

執行結果:
這裡寫圖片描述
四、原理簡介
  在Shell應用程式工程模組使用了ShellCEntryLib,然後實現了ShellAppMain作為程式的入口函式。在使用main函式的應用程式工程模組中使用了StdLib提供了ShellAppMain函式,main函式作為程式入口函式供ShellAppMain呼叫。而真正的入口函式是ShellCEntryLib,呼叫過程為:
 ShellCEntry->ShellAppMain->main
五、總結
  可以看出,使用main函式的應用程式工程模組其實本質Shell應用程式工程模組相同,增加了StdLib庫。

參考資料

<1>《UEFI原理與程式設計》戴正華 著
<2> UEFI Spec2_6