作者:Maxwell Li
日期:2017/12/05
未經(jīng)作者允許,禁止轉(zhuǎn)載本文任何內(nèi)容段磨。如需轉(zhuǎn)載請留言帘不。
[TOC]
“包”是一組模塊及平臺描述文件(.dsc)岁歉、包聲明文件(.dec)組成的集合。
模塊(.efi)像插件一樣可以動態(tài)地加載到 UEFI 內(nèi)核中姑蓝。
在 EDK2 環(huán)境下鹅心,除了要編寫源文件外,還要為工程編寫元數(shù)據(jù)文件(.inf)纺荧。
3.1 標(biāo)準(zhǔn)應(yīng)用程序工程模塊
標(biāo)準(zhǔn)引用程序工程模塊是其它應(yīng)用程序模塊的基礎(chǔ)巴帮,也是UEFI中常見的一種應(yīng)用程序模塊。每個工程模塊由兩部分組成:工程文件和源文件虐秋。
3.1.1 源文件
示例程序:
#include<Uefi.h>
EFI_STATUS UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
SystemTable->ConOut->OutputString(SystemTable->ConOut,L"HelloWorld\n");
return EFI_SUCESS;
}
標(biāo)準(zhǔn)應(yīng)用程序至少包含以下兩個部分:
- 頭文件:所有的 UEFI 程序都要包含頭文件 Uefi.h垃沦。該文件定義了 UEFI 基本數(shù)據(jù)類型及核心數(shù)據(jù)結(jié)構(gòu)客给。
- 入口函數(shù):入口函數(shù)由工程文件 UefiMain.inf 指定,通常是 UefiMain肢簿,其函數(shù)簽名(返回值類型和參數(shù)列表類型)不能變化靶剑。
入口函數(shù)返回值類型是 EFI_STATUS。
- UEFI 程序中基本上所有返回值類型都是 EFI_STATUS池充,其本質(zhì)是無符號長整數(shù)桩引。
- 最高位為1時其值為錯誤代碼,最高位為0時表示非錯誤值收夸。若返回值 Status 為錯誤碼坑匠,宏 EFI_ERROR(Status) 返回真,否則返回假卧惜。
- EFI_SUCESSS 為預(yù)定義常量厘灼,值為0,表示沒有錯誤的狀態(tài)值和返回值咽瓷。
入口函數(shù)的參數(shù) ImageHandl 和 SystemTable设凹。
- .efi 文件加載到內(nèi)存后生成的對象稱為 Image。ImageHandle 是 Image 的句柄茅姜,作為模塊入口函數(shù)的參數(shù)闪朱,它表示模塊自身加載到內(nèi)存后生成的 Image 對象。
- SystemTable 是程序和 UEFI 內(nèi)核交互的橋梁钻洒,通過他可以獲得 UEFI 提供的各種服務(wù)奋姿。SystemTable 是 UEFI 內(nèi)核的一個全局結(jié)構(gòu)體。
向標(biāo)準(zhǔn)輸出設(shè)備打印字符串是通過 SystemTable 的 ConOut 提供的 OutputString 服務(wù)完成的航唆。ConOut 是 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL 的一個實例胀蛮,而 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL 主要功能是控制字符輸出設(shè)備。OutputString 服務(wù)的第一個參數(shù)是 This 指針糯钙,指向 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL 實例(此處為 ConOut 本身)粪狼。第二個參數(shù)是 Unicode 字符串退腥。這條打印語句的意義就是通過 SystemTable->ConOut->OutputString 服務(wù)將字符串 L“Hello World” 打印到 SystemTable->ConOut 所控制的字符串輸出設(shè)備。
3.1.2 工程文件
工程文件分為很多塊再榄,詳細的工程模塊如下所示:
[Defines]
[Defines] 塊用于定義模塊的屬性和其他變量狡刘,塊內(nèi)定義的變量可以被其他塊應(yīng)用。
- 語法:屬性名 = 屬性值
- 塊內(nèi)必須屬性:
- INF_VERSION:INF 標(biāo)準(zhǔn)版本號困鸥。EDK2 的 build 會檢查 INF_VERSION 的值并根據(jù)這個值解釋 .inf 文件嗅蔬。
- BASE_NAME:模塊名字字符串,也是輸出文件的名字疾就。
- FILE_GUID:每個工程文件必須有一個 8-4-4-4-12 格式的 GUID澜术,用于生成固件。
- VERSION_STRING:模塊的版本號字符串猬腰。
- MODULE_TYPE:定義模塊的類型鸟废,對于標(biāo)準(zhǔn)應(yīng)用模塊,設(shè)為 UEFI_APPLICATION
- ENTRY_POINT:定義模塊的入口函數(shù)姑荷,根據(jù)源文件中的入口函數(shù)填寫盒延。
示例:
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = HelloWorld
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
[Sources] 塊用于列出模塊的所有源文件和資源文件。
- 語法:每一行表示一個文件鼠冕,文件使用相對工程文件的路徑添寺。
-
體系結(jié)構(gòu)相關(guān)塊:
$(Arch)
表示本塊適用的體系結(jié)構(gòu),可以是 IA32懈费、X64计露、IPF、EBC楞捂、ARM 中的一個薄坏。列出對應(yīng)的[Sources.(Arch)]
,然后根據(jù)編譯時標(biāo)識設(shè)置寨闹,[Sources.$(Arch)]
中和標(biāo)識相符的才會被編譯胶坠。 - 編譯工具鏈相關(guān)的源文件:有時文件后跟工具鏈名稱,表示只有在該工具鏈編譯器編譯時才有效繁堡。
示例:
//體系結(jié)構(gòu)相關(guān)塊示例
[Sources]
Common.c
[Sources.IA32]
Cpu32
[Sources.X64]
Cpu64
//編譯工具鏈相關(guān)的源文件示例
[Sources]
TimerWin.c | MSFT
TimerLinux.c | GCC
[Packages]
[Packages] 塊中列出了本模塊引用到的所有包的包聲明文件(.dec)沈善。
- 語法:每一行列出一個文件,文件使用相對 EDK2 的路徑椭蹄。若 [Sources] 列出了源文件闻牡,則 [Packages] 塊必須列出 MdePkg/MdePkg.dec,并放在本塊首行绳矩。
[LibraryClasses]
[LibraryClasses] 塊列出本模塊要鏈接的庫模塊罩润。
- 語法:每一行聲明一個要鏈接的庫。
- 常用庫:應(yīng)用程序工程模塊必須鏈接 UefiApplicationEntryPoint 庫翼馆;驅(qū)動模塊必須鏈接 UefiDriverEntyrPoint 庫割以。
[Protocols]
[Protocols] 塊列出模塊中使用的 Protocol 對應(yīng)的 GUID金度。
[BuildOptions]
[BuildOptions] 塊指定本模塊的編譯和連接選項。
-
語法:
[編譯器家族]:[$(Target)]_[TOOL_CHAIN_TAG]_[$(Arch)]_[CC|DLINK]_FLAGS[=|==]選項
- 編譯器家族:MSFT严沥、INTEL猜极、GCC、RVCT消玄。
- Target:DEBUG跟伏、RELEASE、翩瓜。 為通配符受扳。
- TOOL_CHAIN_TAG:編譯器名字,定義在 Conf/tools_def.txt 文件中兔跌。
- Arch:體系結(jié)構(gòu)辞色,可以是 IA32、X64浮定、IPF、EBC层亿、ARM桦卒、*。
- CC|DLINK:CC 表示編譯選項匿又,DLINK 表示連接選項方灾。
- =|==:= 表示選項附加到默認選項后,== 表示僅使用定義的選項碌更,棄用默認選項裕偿。
示例:(該選項可以避免一些無關(guān)緊要的警告在 EDK2 編譯模塊文件時作為錯誤)
[BuildOptions]
MSFT:*_*_*_CC_FLAGS = /w
3.1.3 標(biāo)準(zhǔn)應(yīng)用程序加載過程
應(yīng)用程序編譯過程:
- UefiMain.c 首先被編譯成目標(biāo)文件 UefiMain.obj。
- 連接器將目標(biāo)文件 uefiMain.obj 和其他庫連接成 UefiMain.dll痛单。
- GenFw 工具將 UefiMain.dll 轉(zhuǎn)換成 UefiMain.efi嘿棘。
連接器在生成 UefiMain.dll 時使用了 /dll/entry:_ModuleEntryPoint。.efi 是遵循 PE32 格式的二進制文件旭绒,_ModuleEntryPoint 便是這個二進制文件的入口函數(shù)鸟妙。
將 UefiMain.efi 文件加載到內(nèi)存
當(dāng) shell 中執(zhí)行 UefiMain.efi 時,shell 首先用 gBS->LoadImage() 將UefiMain.efi 文件加載到內(nèi)存生成 Image 對象挥吵,然后調(diào)用 gBS->StartImag(Image) 啟動這個 Image 對象重父。StartImage 主要作用是找出可執(zhí)行程序 Image 的入口函數(shù)并執(zhí)行。gBS->StartImag() 是一個函數(shù)指針忽匈,指向 CoreStartImage 函數(shù)房午。
進入映像入口函數(shù)
CoreStartImage 的主要作用就是調(diào)用映像的入口函數(shù)。gBS->StartImage 的核心是Image->EntryPoint(···)丹允,它就是程序映像的入口函數(shù)郭厌,對應(yīng)程序來說就是 _ModuleEntryPoint 函數(shù)袋倔。進入 _ModuleEntryPoint 后,控制權(quán)才轉(zhuǎn)交給應(yīng)用程序(UefiMain.efi)沪曙。
_ModuleEntryPoint 部分代碼如下:
EFI_STATUS
EFIAPI
_ModuleEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
if (_gUefiDriverRevision != 0) {
// Make sure that the EFI/UEFI spec revision of the platform is >= EFI/UEFI spec revision of the application.
if (SystemTable->Hdr.Revision < _gUefiDriverRevision) {
return EFI_INCOMPATIBLE_VERSION;
}
}
// Call constructor for all libraries.
ProcessLibraryConstructorList (ImageHandle, SystemTable);
// Call the module's entry point
Status = ProcessModuleEntryPointList (ImageHandle, SystemTable);
// Process destructor for all libraries.
ProcessLibraryDestructorList (ImageHandle, SystemTable);
// Return the return status code from the driver entry point
return Status;
}
_ModuleEntryPoint 主要處理三件事:
- 初始化:初始化函數(shù) ProcessLibraryConstructorList 中調(diào)用一系列構(gòu)造函數(shù)奕污。
- 調(diào)用本模塊的入口函數(shù):ProcessModuleEntryPointList 中調(diào)用的是工程模塊定義的入口函數(shù)。
- 析構(gòu):ProcessLibraryDestructorList 中調(diào)用一系列析構(gòu)函數(shù)液走。
進入模塊入口函數(shù)
在 ProcessModuleEntryPointList 函數(shù)中調(diào)用了工程模塊的真正入口函數(shù)UefiMain碳默。
標(biāo)準(zhǔn)應(yīng)用程序工程模塊入口函數(shù)調(diào)用的整個過程:StartImage -> _ModuleEntryPoint -> ProcessModuleEntryPointList -> UefiMain。
3.2 其他類型工程模塊
3.2.1 Shell 應(yīng)用程序工程模塊
源文件
Shell 應(yīng)用程序工程模塊以 INTN ShellAppMain(In UINTN Argc, IN CHAR16**Argv) 作為入口函數(shù)缘眶。
#include <Uefi.h>
#include <Library/UefiBootServicesTableLib.h>
INTN ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv)
{
gST->ConOut->OutputString (gST->ConOut,L"HelloWorld\n");
return 0;
}
第一個參數(shù) Agrc 是命令行參數(shù)個數(shù)嘱根,第二個參數(shù) Argv 是命令行參數(shù)列表,列表中每個參數(shù)都是 Unicode 字符串巷懈。
工程文件
- [Defines] 塊基本與標(biāo)準(zhǔn)應(yīng)用程序工程模塊相同该抒,除了 ENTRY_POINT,必須設(shè)置為 ShellAppMain顶燕。
- [Packages] 塊中必須列出 MdePkg/MdePkg.dec 和 ShellPkg/ShellPkg.dec凑保。
- [LibraryClasses] 塊中必須列出 ShellCEntryLib,通常還要列出 UefiBootServicesTableLib 和 UefiLib涌攻。
示例:
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = Main
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = ShellCEntryLib
[Sources]
Main.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
[LibraryClasses]
ShellCEntryLib
UefiBootServicesTableLib
UefiLib
3.2.2 使用 main 函數(shù)的應(yīng)用程序工程模塊
源文件
#include <stdio.h>
int main(IN int Argc,IN char **Argv)
{
printf("Hello World!\n");
return(0);
}
工程文件
- [Defines] 塊中設(shè)置 ENTRY_POINT 為 ShellCEntryLib欧引。
- [Packages] 塊中列出 MdePkg/MdePkg.dec、ShellPkg/ShellPkg.dec恳谎、StdLib/StdLib.dec芝此。
- [LibraryClasses] 塊中列出 ShellCEntryLib、LibC因痛、LibStdio婚苹。
示例:
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = Main
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = ShellCEntryLib
[Sources]
Main.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
StdLib/StdLib.dec
[LibraryClasses]
LibC
LibStdio
ShellCEntryLib
3.2.3 庫模塊
在傳統(tǒng) C/C++ 項目開發(fā)中經(jīng)常會用到庫,EDK2 也提供庫模塊鸵膏。
工程文件
- [Defines] 塊中 MODULE_TYPE 設(shè)置為 BASE膊升。
- [Defines] 塊中 LIBRARY_CLASS 設(shè)置為庫名字,同時不需要設(shè)置 ENTRY_POINT谭企。
- [Packages] 塊中列出庫引用到的包用僧。
- [LibraryClasses] 塊中列出包所依賴的其他庫。
示例:(zlib 庫的工程文件)
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = zlib
FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = zlib
[Sources]
adler32.c
.
.
.
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
StdLib/StdLib.dec
[LibraryClasses]
MemoryAllocationLib
BaseLib
UefiBootServicesTableLib
BaseMemoryLib
UefiLib
有些庫只能被某些特定的模塊調(diào)用赞咙,需在工程文件中聲明庫的適用范圍责循,格式如下:
LIBRARY_CLASS = 庫名稱 | 適用模塊類型1 適用模塊類型 2
編寫好庫后,要使庫能被其它模塊調(diào)用攀操,還要在包的 .dsc 文件中聲明該庫院仿。在[LibraryClasses] 塊中添加庫模塊的工程文件路徑。
[LibraryClasses]
zlib | zlib/zlib.inf
調(diào)用庫模塊時,需要在調(diào)用模塊的工程文件中添加被調(diào)用的庫模塊的庫名歹垫。
[LibraryClasses]
zlib
3.2.4 UEFI 驅(qū)動模塊
在 UEFI 中剥汤,驅(qū)動分為兩類:符合 UEFI 驅(qū)動模型的驅(qū)動,模塊類型為 UEFI_DRIVER排惨,稱為 UEFI 驅(qū)動吭敢;不遵循 UEFI 驅(qū)動模型的驅(qū)動,稱為 DXE 驅(qū)動暮芭。
源文件
驅(qū)動與應(yīng)用程序的模塊入口函數(shù)類型一樣鹿驼,原型如下所示:
typedef EFI_STATUS API (*UEFI_ENTRYPOINT)(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable);
驅(qū)動與應(yīng)用程序的最大區(qū)別是驅(qū)動會常駐內(nèi)存,而應(yīng)用程序執(zhí)行完畢后就會從內(nèi)存清除辕宏。
工程文件
- [Defines] 塊中將 MODULE_TYPE 設(shè)置為 UEFI_DRIVER畜晰。
- [Sources] 塊中通常包含 ComponentName.c,該文件中定義了驅(qū)動的名字瑞筐,驅(qū)動安裝之后凄鼻,這個名字將顯示給用戶。
- [LibraryClasses] 塊中必須包含 UefiDriverEntryPoint聚假。
示例:
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = DiskIoDxe
MODULE_UNI_FILE = DiskIoDxe.uni
FILE_GUID = 6B38F7B4-AD98-40e9-9093-ACA2B5A253C4
MODULE_TYPE = UEFI_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = InitializeDiskIo
[Sources]
ComponentName.c
DiskIo.h
DiskIo.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiBootServicesTableLib
UefiDriverEntryPoint
MemoryAllocationLib
BaseMemoryLib
BaseLib
UefiLib
DebugLib
[Protocols]
gEfiDiskIoProtocolGuid ## BY_START
gEfiBlockIoProtocolGuid ## TO_START
3.3 包及 .dsc块蚌、.dec、.fdf 文件
UEFI 的包中都會有一個 .dsc 文件和一個 .dec 文件膘格。
- build 命令用于編譯包匈子,需要一個 .dsc 文件、一個 .dec 文件和一個或多個 .inf 文件闯袒。
- GenFW 命令用于制作固件或 Option Rom Image,需要一個 .dec 文件和一個 .fdf 文件游岳。
3.3.1 .dsc 文件
.inf 用于編譯一個模塊政敢,而 .dsc 用于編譯一個 Package。它包含幾個必需部分:[Defines]胚迫、[LibraryClasses]喷户、[Components] 和可選部分:[PCD]、[BuildOptions] 等访锻。
[Defines]
[Defines] 用于設(shè)置 build 相關(guān)的全局變量褪尝,這些變量可以被 .dsc 文件的其他模塊引用,必須是 .dsc 文件的第一部分期犬。格式如下:
[Defines]
宏變量名 = 值
DEFINE 宏變量名 = 值
EDK_GLOBAL 宏變量名 = 值
[Defines] 中通過 DEFINE 和 EDK_GLOBAL 定義的宏可以在 .dsc 文件和 .fdf 文件中通過 $(宏變量名)
使用河哑。
示例:
[Defines]
PLATFORM_NAME = Shell
PLATFORM_GUID = E1DC9BF8-7013-4c99-9437-795DAA45F3BD
PLATFORM_VERSION = 1.0
DSC_SPECIFICATION = 0x00010006
OUTPUT_DIRECTORY = Build/Shell
SUPPORTED_ARCHITECTURES = IA32|IPF|X64|EBC|ARM|AARCH64
BUILD_TARGETS = DEBUG|RELEASE
SKUID_IDENTIFIER = DEFAULT
[LibraryClasses]
[LibraryClasses] 塊定義了庫的名字和庫 .inf 文件的路徑,這些庫可以被 [Components] 塊內(nèi)的模塊引用龟虎。語法:
[LibararyClasses.$(Arch).$(MODULE_TYPE)]
LibraryName | path/LibraryName.inf
[LibararyClasses.$(Arch1).$(MODULE_TYPE1), LibararyClasses.$(Arch1).$(MODULE_TYPE1)]
LibraryName | path/LibraryName.inf
-
$Arch
和$MODULE_TYPE
是可選項璃谨。不使用表示通用。 -
$Arch
表示體系結(jié)構(gòu),可以是下列值之一:IA32佳吞、X64拱雏、IPF、EBC底扳、ARM铸抑、common。common 表示對所有體系結(jié)構(gòu)有效衷模。 -
$MODULE_TYPE
表示模塊的類別鹊汛,塊內(nèi)列出的庫只提供$(MODULE_TYPE)
類別的模塊連接。它可以是下列值:SEC算芯、PEI_CORE柒昏、PEIM、DXE_CORE熙揍、DXE_SAL_DRIVER职祷、BASE、DXE_SMM_DRIVER届囚、DXE_DRIVER有梆、DXE_RUNTIME_DRIVER、UEFI_DRIVER意系、UEFI_APPLICATION泥耀、USER_DEFINED。
示例:
[LibraryClasses.common]
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
···
[LibraryClasses.ARM]
NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
···
[LibraryClasses.AARCH64]
NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
···
[Components]
[Components] 塊內(nèi)定義的模塊都會被 build 工具編譯并生成 .efi 文件蛔添,格式如下:
[Components]
path\Exectuables.inf
[Components]
path\Exectuables.inf{
<LibraryClasses> # 嵌套塊
LibraryName | Path/LibraryName.inf
BuildOptions> # 嵌套塊
#子塊中還可以包含< Pcds*>
}
path 使用相對于EDK2根目錄的相對路徑痰催。
[BuildOptions]
[BuildOptions] 塊和 .inf 中的用法相同。
[PCD]
[PCD] 塊用于定義平臺配置數(shù)據(jù)迎瞧,其目的是在不改動 .inf 文件和源文件的情況下完成對平臺的配置夸溶。
例如:
在 UEFI 模擬器 Nt32Pkg 的 Nt32Pkg.dsc 文件中,可以通過 PCD 的 PcdWinNtFileSystem 來配置模擬器的文件系統(tǒng)路徑凶硅。如下所示:
gEFINt32PkgTokenSpaceGuid.PcdWinNtFileSystem|L".!..\..\..\..\EdkShellBinPkg\Bin\Ia32\Apps"|VOID*|106
“|”將配置分為了四個部分缝裁,第一部分 gEFINt32PkgTokenSpaceGuid 是名字空間,第二部分是值足绅,第三部分是變量類型捷绑,第四部分是變量數(shù)據(jù)的最大長度。
在源文件中可以使用 LibPcdGetPtr(_PCD_TOKEN_PcdWinNtFileSystem) 獲得 gEfiNt32PkgTokenSpaceGuid.PcdWinFileSyste 定義的值氢妈。
3.3.2 .dec 文件
.dec 文件定義了公開的數(shù)據(jù)和接口粹污,供其他模塊使用。包含了必需區(qū)塊 [Defines] 和可選區(qū)塊 [Includes]首量、[LibraryClasses]厕怜、[Guids]、[Protocol]、[Ppis]粥航、[PCD] 幾個部分琅捏。
[Defines]
[Defines] 塊用于提供 Package 的名稱、GUID递雀、版本號等信息柄延。
示例:
[Defines]
DEC_SPECIFICATION = 0x00010005
PACKAGE_NAME = MdePkg
PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
PACKAGE_VERSION = 1.03
[Includes]
[Includes] 塊內(nèi)列出了本 Package 提供的頭文件所在目錄。
示例:
[Includes]
Include
[Includes.IA32]
Include/Ia32
[Includes.X64]
Include/X64
[LibraryClasses]
Package 可以通過 .dec 文件對外提供庫缀程,每個庫都必須有一個頭文件搜吧,放在 Include\Library 目錄下。[LibraryClasses] 塊用于明確庫和頭文件的對應(yīng)關(guān)系杨凑。
示例:
[LibraryClasses]
UefiUsbLib|Include/Library/UefiUsbLib.h
[LibraryClasses.IA32, LibraryClasses.X64]
SmmLib|Include/Library/SmmLib.h
[Guids]
在 Package\Include\Guid 目錄中有很多文件滤奈,每個文件內(nèi)定義了一個或幾個 GUID。這些定義只是聲明撩满,常量真正定義在 AutoGen.c 中蜒程,它的值定義在 .dec 文件的 [Guids] 區(qū)塊。
示例:
[Guids]
## Include/Guid/Gpt.h
gEfiPartTypeLegacyMbrGuid = { 0x024DEE41, 0x33E7, 0x11D3, { 0x9D, 0x69, 0x00, 0x08, 0xC7, 0x81, 0xF3, 0x9F }}
## Include/Guid/Gpt.h
gEfiPartTypeSystemPartGuid = { 0xC12A7328, 0xF81F, 0x11D2, { 0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B }}
## Include/Guid/Gpt.h
gEfiPartTypeUnusedGuid = { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}
當(dāng)在模塊工程文件的 [Guids] 中引用這些 Guid 時伺帘,這些值就會復(fù)制到 AutoGen.c 中昭躺。
[Protocols]
在 Package\Include\Protocols 目錄下有很多頭文件,每個頭文件定義了一個或多個 Protocol伪嫁,這些 Protocol 的 GUID 值就定義在 .dec 文件的 [Protocols] 區(qū)塊领炫。
示例:gEfiBlockIoProtocolGuid 的值就定義在 MdePkg.dec 的 [Protocols] 塊內(nèi)。
[Protocols]
gEfiBlockIoProtocolGuid = { 0x964E5B21, 0x6459, 0x11D2, { 0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }}