高通QCS平臺UEFI爬坑之旅二:UEFI工程檔案

2020-08-11 15:53:08

高通QCS平臺UEFI爬坑之旅二:UEFI工程檔案

參考:UEFI原理與程式設計

  • 我們大概弄明白UEFI與BIOS的區別以及UEFI的啓動階段,接下來我們需要在這段「坑旅」往前一步了。在我們寫程式碼前,我們再來了解一下如果我們自己寫一個UEFI的工程需要什麼。好的,上硬菜!

硬 菜:

首先我們先理解一下兩個概念:模組(Module)、包(Package)。
我們可以在BOOT.XF.0.1/boot_images/ 目錄下看到有很多以*Pkg命名的資料夾,每一個這樣的資料夾稱爲一個Package,其實這樣的理解不太準確,應該說,「包」是一組模組及平臺描述檔案(.dsc檔案)、包宣告檔案(.dec檔案)組成的集合。模組是UEFI系統的一個特色。模組(可執行檔案.efi檔案)
像外掛一樣可以動態地載入到UEFI內核中。而每個工程模組由元數據檔案(.inf檔案)和原始檔組成。

UEFI模組

模組型別 相應說明
標準應用程式工程模組 在DXE階段執行的應用程式(Shell環境下也可以執行)
ShellAppMain應用程式工程模組 Shell環境下執行的應用程式
main應用程式工程模組 Shell環境下執行的應用程式,並且應用程式鏈接了StdLib庫
UEFI驅動模組 符合UEFI驅動模組模型的驅動,僅在BS期間有效
庫模組 作爲靜態庫被其他模組呼叫
DXE驅動模組 DXE環境下執行的驅動,此類驅動不遵循UEFI驅動模型
DXE執行時驅動模組 進入執行期仍然有效的驅動
DXE SAL驅動模組 僅對安騰CPU有效的一種驅動
DXE SMM驅動模組 系統管理模式驅動,模組被載入到系統管理記憶體區。系統進入執行期該驅動仍然有效
PEIM模組 PEI階段的模組
SEC模組 韌體的SEC階段
PEI_CORE模組 韌體的PEI階段
DXE_CORE模組 韌體的DXE階段

標準應用程式工程模組

標準應用程式工程模組是其他應用程式工程模組的基礎,也是UEFI中常見的一種應用程式工程模組。每個工程模組由兩個部分組成:工程檔案與原始檔。所以,一個簡單的標準應用程式工程模組包括一個C程式原始檔(如Main.c)以及一個工程檔案(如Main.inf)。

工程檔案

想要編譯你的自己的Main.c就需要編寫相應的.inf(Module Information File)檔案,是模組的工程檔案。工程檔案分爲很多的塊:
必需塊 塊描述
[Defines] 定義本模組的屬性變數及其他變數,這些變數可在工程檔案其他塊中應用
[Sources] 列出本模組的所有原始檔及資原始檔
[Packages] 列出本模組參照到的所有包的宣告檔案。可能參照到的資源包括標頭檔案、GUID、Protocal等,這些資源都宣告在包的包宣告檔案.dec中
[LibraryClasses] 列出本模組要鏈接的庫模組
非必需塊 塊描述
[Protocols] 列出本模組用到的Protocol
[Guids] 列出本模組用到的GUID
[BuildOptions] 指定編譯和鏈接選項
[Pcd] Pcd全稱爲平臺設定數據庫(Platform Configuration Database)。用於列出本模組用到的Pcd變數,這些Pcd變數可被整個UEFI系統存取
[PcdEx] 用於列出本模組用到的Pcd變數,這些Pcd變數可被整個UEFI系統存取
[FixedPcd] 用於列出本模組用到的Pcd編譯期常數
[FeaturePcd] 用於列出本模組用到的Pcd常數
[PatchPcd] 列出的Pcd變數僅本模組可用

接下來,我們講述一下必需塊的用法:

  • [Defines]
    塊內必須定義的屬性包括:
    • INF_VERSION:INF標準的版本號,通常將INF_VERSION設定爲0x00010005即可。
    • BASE_NAME:模組名字字串,不能有空格。如果Base_Name是UefiMain,則最終生成的檔案爲UefiMain.efi。
    • FILE_GUID:每個工程檔案必須有一個8-4-4-4-12格式的GUID,用於生成韌體。
    • VERSION_STRING:模組的版本號字串。例如:VERSION_STRING=1.0。
    • MODULE_TYPE:定義模組的模組型別,可以是SEC、PEI_CORE、PEIM、DXE_CORE、DXE_SAL_DRIVER、DXE_SMM_DRIVER、UEFI_DRIVER、DXE_DRIVER、DXE_RUNTIME_DRIVER、UEFI_APPLICATION、BASE中的一個。
    • ENTRY_POINT:定義模組的入口函數。
    Example:
    [Defines]
       INF_VERSION = 0x00010005
       BASE_NAME = UefiMain
       FILE_GUID = 90A49AFD-42C3-08AE-9611-368652008636
       MODULE_TYPE = UEFI_APPLICATION
       VERSION_STRING = 1.0
       ENTRY_POINT = Main
  • [Sources]
    [Sources]用於列出模組的所有原始檔和資原始檔。
    • [Sources.$(Arch)]
      .$(Arch)是可選項,可以是IA32、X64、IPF、EBC、ARM中的一個,表示本模組適用的體系結構。[Sources]塊適用與任何體系結構。
    • Example:
      [Sources]
         main.c
  • [Packages]
    [Packages]列出本模組參照到的所有包的包宣告檔案(.dec檔案)。
    • [Packages]塊內每一行列出一個檔案,檔案使用相對路徑,相對路徑的根路徑爲EDK2的根目錄。若[Sources]塊內列出了原始檔,則在[Packages]塊必須列出MdePkg/MdePkg.dec,並將其放在本塊的首行。
    • Example:
      [Packages]
         MdePkg/MdePkg.dec
  • [LibraryClasses]
    [LibraryClasses]列出本模組要鏈接的庫模組。
    • [LibraryClasses]塊內每一行宣告一個要鏈接的庫
    • 常用庫:應用程式工程模組必須鏈接UefiApplicationEntryPoint庫;驅動模組必須鏈接UefiDriverEntryPoint庫。
    • Example:
      [LibraryClasses]
         UefiApplicationEntryPoint

以上的知識是對UEFI工程檔案的簡單描述分析,算是程式設計前的準備吧,畢竟有所理解才能 纔能更好地去編寫程式碼嘛,下一篇將開始帶大家瞭解一下高通定製的UEFI。希望大夥們多多支援。