UEFI原理與程式設計(四):UEFI工程模組檔案-使用main函式的應用程式工程模組
阿新 • • 發佈:2019-01-28
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