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);
}
二、工程文件
基本上和Shell應用程序模塊相同,注意一下幾點。
- [Defines]塊中的
ENTRY_POINT
需設爲ShellCEntryLib
- [Packages]塊中列出 MdePkg/MdePkg.dec、ShellPkg/ShellPkg.dec、StdLib/StdLib.dec.
- [LibraryClasses]塊中列出ShellCEntryLib、LibC、LibStdio
注:ShellCEntryLib提供ShellCEntryLib函數;LibC提供ShellAppMain函數;LibStdio
- [Defines]塊中的
- 使用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