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

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