第三章 UEFI 工程模塊文件

作者: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 工程文件

工程文件分為很多塊再榄,詳細的工程模塊如下所示:

工程文件塊.png

[Defines]

[Defines] 塊用于定義模塊的屬性和其他變量狡刘,塊內(nèi)定義的變量可以被其他塊應(yīng)用。

  • 語法:屬性名 = 屬性值
  • 塊內(nèi)必須屬性:
  1. INF_VERSION:INF 標(biāo)準(zhǔn)版本號困鸥。EDK2 的 build 會檢查 INF_VERSION 的值并根據(jù)這個值解釋 .inf 文件嗅蔬。
  2. BASE_NAME:模塊名字字符串,也是輸出文件的名字疾就。
  3. FILE_GUID:每個工程文件必須有一個 8-4-4-4-12 格式的 GUID澜术,用于生成固件。
  4. VERSION_STRING:模塊的版本號字符串猬腰。
  5. MODULE_TYPE:定義模塊的類型鸟废,對于標(biāo)準(zhǔn)應(yīng)用模塊,設(shè)為 UEFI_APPLICATION
  6. 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[=|==]選項
  1. 編譯器家族:MSFT严沥、INTEL猜极、GCC、RVCT消玄。
  2. Target:DEBUG跟伏、RELEASE、翩瓜。 為通配符受扳。
  3. TOOL_CHAIN_TAG:編譯器名字,定義在 Conf/tools_def.txt 文件中兔跌。
  4. Arch:體系結(jié)構(gòu)辞色,可以是 IA32、X64浮定、IPF、EBC层亿、ARM桦卒、*。
  5. CC|DLINK:CC 表示編譯選項匿又,DLINK 表示連接選項方灾。
  6. =|==:= 表示選項附加到默認選項后,== 表示僅使用定義的選項碌更,棄用默認選項裕偿。

示例:(該選項可以避免一些無關(guān)緊要的警告在 EDK2 編譯模塊文件時作為錯誤)

[BuildOptions]
  MSFT:*_*_*_CC_FLAGS = /w

3.1.3 標(biāo)準(zhǔn)應(yīng)用程序加載過程

應(yīng)用程序編譯過程:

  1. UefiMain.c 首先被編譯成目標(biāo)文件 UefiMain.obj。
  2. 連接器將目標(biāo)文件 uefiMain.obj 和其他庫連接成 UefiMain.dll痛单。
  3. 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 主要處理三件事:

  1. 初始化:初始化函數(shù) ProcessLibraryConstructorList 中調(diào)用一系列構(gòu)造函數(shù)奕污。
  2. 調(diào)用本模塊的入口函數(shù):ProcessModuleEntryPointList 中調(diào)用的是工程模塊定義的入口函數(shù)。
  3. 析構(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 文件中通過 $(宏變量名) 使用河哑。

dsc宏變量.png

示例:

[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 }}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末张咳,一起剝皮案震驚了整個濱河市帝洪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脚猾,老刑警劉巖葱峡,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婚陪,居然都是意外死亡,警方通過查閱死者的電腦和手機频祝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門泌参,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人常空,你說我怎么就攤上這事沽一。” “怎么了漓糙?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵铣缠,是天一觀的道長。 經(jīng)常有香客問我,道長蝗蛙,這世上最難降的妖魔是什么蝇庭? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捡硅,結(jié)果婚禮上哮内,老公的妹妹穿的比我還像新娘。我一直安慰自己壮韭,他們只是感情好北发,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喷屋,像睡著了一般琳拨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯曹,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天狱庇,我揣著相機與錄音,去河邊找鬼是牢。 笑死僵井,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驳棱。 我是一名探鬼主播批什,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼社搅!你這毒婦竟也來了驻债?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤形葬,失蹤者是張志新(化名)和其女友劉穎合呐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笙以,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡淌实,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猖腕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拆祈。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倘感,靈堂內(nèi)的尸體忽然破棺而出放坏,到底是詐尸還是另有隱情,我是刑警寧澤老玛,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布淤年,位于F島的核電站钧敞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏麸粮。R本人自食惡果不足惜溉苛,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹休。 院中可真熱鬧炊昆,春花似錦、人聲如沸威根。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洛搀。三九已至敢茁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間留美,已是汗流浹背彰檬。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谎砾,地道東北人逢倍。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像景图,于是被迫代替她去往敵國和親较雕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 作者:Maxwell Li日期:2017/12/09未經(jīng)作者允許挚币,禁止轉(zhuǎn)載本文任何內(nèi)容亮蒋。如需轉(zhuǎn)載請留言。 [TOC...
    Maxwell_Li閱讀 2,583評論 0 0
  • 作者:Maxwell Li日期:2017/12/07未經(jīng)作者允許妆毕,禁止轉(zhuǎn)載本文任何內(nèi)容慎玖。如需轉(zhuǎn)載請留言。 [TOC...
    Maxwell_Li閱讀 10,953評論 1 3
  • 今天第一次參加公司的產(chǎn)品討論笛粘,觸動還是挺大的趁怔,和公司的四位最高領(lǐng)導(dǎo)還有團隊同事坐在一張桌子邊,聽著大家的討論薪前,在討...
    霓裳mg閱讀 210評論 0 0
  • 懶惰不會讓你一下子跌倒 但會在不知不覺中減少你的收獲润努, 勤奮也不會讓你一夜成功 但會在不知不覺中積累你的成果 越努...
    澤楨寶貝閱讀 194評論 1 1
  • 首先任连,你要過兩道關(guān)蚤吹,這兩道關(guān)非常簡單例诀。第一随抠,下單之前不要著急,千萬不要亂做繁涂、瞎做拱她。下單以前要耐得住性子,耗得起時間...
    老鄭_e744閱讀 429評論 0 0