使用者工具

網站工具


uefi_learning

這是本文件的舊版!


UEFI 學習

  • DSC – Platform Description File, 是對整個 Package 的描述。DSC描述的是整個解決方案,再進一步切分後就是具有具體功能的工程文件。
  • DEC – Package Declaration File, 定義公開的數據和接口。意味著其他的 Package 就可以調用這些公開的內容,是UEFI接口的實現。
  • INF – INF 文件就是描述這個具體工程。

INF的組成

Needed Block Description
[Defines] 定義本模塊的屬性變量及其他變量,這些變量可在工程文件其他塊中引用
[Sources] 列出本模塊的所有源文件及資源文件
[Packages] 列出本模塊引用到的所有包的包聲明文件。可能引用到的資源包括投文件、GUID、Protocol等,這些資源都聲明再包的包聲明文件.dec中
[LibraryClasses] 列出本模塊要練接的庫模塊
Option Block Description
[Protocols] 列出本模塊用到的 Protocol
[Guids] 列出本模塊用到的 GUID
[BuildOptions] 指定編譯和鏈接選項
[Pcd] Pcd 全稱為平台配置數據庫 (Platform Configuration Database)。 [Pcd] 用於列出本模塊用到的Pcd變量,這些Pcd變量可被整個 UEFI系統訪問
[PcdEx] 用於列出本模塊用到的Pcd變量,這些 Pcd變量可被整個 UEFI系統訪問
[FixedPcd] 用於列出本模塊用到的Pcd編譯期常量
[FeaturePcd] 用於列出本模塊用到的Pcd 常量
[PatchPcd] 列出的Pcd 變量僅本模塊可用

1.[Defines]块: 属性定义语法:
属性名 = 属性值

[Defines]
  INF_VERSION                    = 0x00010005    //必须 ,INF标准的版本号。edsk2的build会检查这个值而去解释.inf文件,最新的版本号是0x00010016,通常设置成0x00010015就行
  BASE_NAME                      = DxeCore    //必须,模块名字字符串,不能包含空格。它通常也是输出文件的名字,生成文件DxeMain.efi
  MODULE_UNI_FILE                = DxeCore.uni    //非必须 ,字符串资源文件
  FILE_GUID                      = D6A2CB7F-6A18-4e2f-B43B-9920A733700A    //必须, 8-4-4-4-4-12格式的唯一GUID,用于生成固件,
  MODULE_TYPE                    = DXE_CORE    //必须 ,定义模块的模块类型。SEC、PEIM、DXE_DEIVER等
  VERSION_STRING                 = 1.0    //必须, 模块的版本号字符串
  ENTRY_POINT                    = DxeMain    //必须,模块的入口函数

2、[Sources]块:
此块下的每一行表示一个文件,文件使用相对路径

[Sources]    //一般情况下不指定特定编译项时,使用这个即可,适用于任何体系结构
  Test.c

[Sources.IA32]    //编译32位模块时(build命令选项中指定了-a IA32选项),包含这个和Sources中的Test.c
  Cpu32.c

[Sources.X64]    //编译64位模块时,包含这个和Sources中的Test.c
  Cpu64.c
  
[Sources]
TimerWin.c | MSFT    //指定编译器有效
TimerLinux.c | GCC    //指定编译器有效


<code>

[BuildOptions]

# Enable STDARG for variable arguments
*_*_*_CC_FLAGS = -DHAVE_STDARG_H
# Override MSFT build option to remove /Oi and /GL
MSFT:*_*_*_CC_FLAGS          = /GL-
INTEL:*_*_*_CC_FLAGS         = /Oi-
# Oniguruma: potentially uninitialized local variable used
MSFT:*_*_*_CC_FLAGS = /wd4701 /wd4703
# Oniguruma: intrinsic function not declared
MSFT:*_*_*_CC_FLAGS = /wd4164
# Oniguruma: old style declaration in st.c
MSFT:*_*_*_CC_FLAGS = /wd4131
# Oniguruma: 'type cast' : truncation from 'OnigUChar *' to 'unsigned int'
MSFT:*_*_*_CC_FLAGS = /wd4305 /wd4306
# Oniguruma: nameless union declared in regparse.h
MSFT:*_*_*_CC_FLAGS = /wd4201
# Oniguruma: 'type cast' : "int" to "OnigUChar", function pointer to "void *"
MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4054
# Oniguruma: previous local declaration
MSFT:*_*_*_CC_FLAGS = /wd4456
# Oniguruma: signed and unsigned mismatch/cast
MSFT:*_*_*_CC_FLAGS = /wd4018 /wd4245 /wd4389
# Oniguruma: tag_end in parse_callout_of_name
GCC:*_*_*_CC_FLAGS = -Wno-error=maybe-uninitialized
# Oniguruma: implicit conversion from 'UINTN' (aka 'unsigned long long') to 'long'
GCC:*_CLANG9_*_CC_FLAGS = -Wno-error=constant-conversion
# Not add -Wno-error=maybe-uninitialized option for XCODE
# XCODE doesn't know this option
XCODE:*_*_*_CC_FLAGS =

</code>

UEFI 編譯 BaseTools
make -C BaseTools

Module type 描述
BASE可執行在任何環境下
SEC在SEC階段執行,將資料傳進PEI階段[註3]
PEIM在PEI階段執行
DXE_DRIVER在boot service環境下執行,直至呼叫ExitBootService而中斷
DXE_RUNTIME_DRIVER在Run Time階段仍可執行的DXE Module
UEFI_APPICATION可在UEFI Shell被執行
UEFI_DRIVER只在boot service環境下有效

EDK2 Directory Description

目錄 說明
AppPkgUEFI Application Development Kit是一系列用來進行uefi app開發的套件,標準依賴庫,工具以及demo,目標是降低UEFI app的開發門檻。
MdePkg全稱為“Module Development Environment Package”,這是一個特殊的package,包含了用於開發一個module所需要的最小環境。一個module可能也會依賴於其他的Package,但是所有modules必須依賴於MdePkg。
MdeModulePkg此包提供符合UEFI/PI工業標準的模組,也提供該標準相關的開發環境,PPIs/PROTOCOLs/GUIDs和依賴庫。
ArmPkg提供ARM架構相關的protocols,屬於ARM平臺上的通用代碼。
ArmPlatformPkgARM開發板相關的UEFI代碼,包含ARM平臺上通用的一些組件,重複利用這些組建會令ARM平臺的不同板型之間的移植變得更加容易。
BaseTools該包提供編譯相關的工具用於EDK和EDK2,比如:AutoGen, Build, GenSec, GenFV, GenFW, GenRds工具。
BeagleBoardPkgBeagleBoard是一個便宜並且靈活的單板電腦,玩過開發板的同學應該都瞭解過,基於OMAP3530 SoC (ARM Cortex TM-A8)處理器的開發板。這個包裡是對此開發板的支持代碼。
CorebootModulePkgCoreboot原本和UEFI/BIOS是競爭關係,但是現在Coreboot也逐漸向UEFI標準靠攏,目前依靠此包可以輕鬆從coreboot啟動到UEFI,Coreboot Support Modules包含了如下代碼:用來解析coreboot table的代碼,報告記憶體/IO資源的代碼,安裝acpi table和smbios table 到EFI系統表中的代碼。它位於uefi環境和hardware的中間層。
CorebootPayloadPkg用來載入上層UEFI環境的中間層,Hardware→Coreboot→CorebootPayloadPkg→UEFI→HLOS
CryptoPkgUEFI定義了HLOS(high level OS)和平臺固件之間的介面,多個安全特性也在2.2版本之後加入其中,此包是用來提供加密支援的。
DuetPkg開發者使用的UEFI模擬器,能夠在BIOS機器上模擬UEFI環境。DUET 是基於Legacy BIOS 提供了UEFI模擬器,提供了在傳統BIOS系統上的UEFI環境。
EdkCompatibilityPkgEDK相容包提供庫和標頭檔用來使能在UEFI2.0+Framework0.9x模式下的EDK編譯。
EdkShellPkg, EdkShellBinPkgEDK Shell開發包以及一個官方的EDK Shell實現,這兩個包已經在被Shell 2.x逐漸取代了。
ShellPkg,ShellBinPkgShell 2.x版本開發包以及一個官方的UEFI Shell 實現。
EmbeddedPkg為memory mapped controllers提供protocol實現,以及一個簡單的EFI shell(EBL)。
EmulatorPkgEmulator虛擬環境,用來取代Nt32Pkg和UnixPkg,可以跨平臺編譯運行的一個虛擬器。
Nt32Pkg一個win環境下的UEFI虛擬器,不能用語載入實際的OS,只能用來調試UEFI代碼。已經逐漸被Emulator取代。
UnixPkg一個類Unix作業系統下的UEFI虛擬器,已經逐漸被Emulator取代。
OvmfPkgOVMF是用來給虛擬機器提供UEFI支援的包,可以使用QEMU和KVM來引導OVMF固件,並進一步引導HLOS。
NetworkPkg提供網路支援的包,比如:IPv6網路通訊協定棧/IPsec驅動/PXE驅動/iSCSI驅動/網路配置相關的shell app。
Omap35xxPkgOmap35xxPkg是Texas Instrument OMAP35xx平臺支援包。
OptionRomPkg這個包的目的是為了提供Option ROM image支援的,如果要編譯PCI相容的Option ROM image,需要依賴此包。
SecurityPkg提供了四種安全相關的特性:TPM, User identification (UID),secure boot, authenticated variable
StdLib, StdLibPrivateInternalFilesStdLib提供了標準庫的UDK實現,StdLibPrivateInternalFiles包是用來給StdLib使用的,不能用作其他引用。
UefiCpuPkg提供相容UEFI的CPU模組和庫。
SourceLevelDebugPkg用來提供debug支援的包。
SignedCapsulePkg提供了一個簽名校驗方案,用來支持安全升級和恢復。
PcAtChipsetPkg這個包提供了符合PcAt標準器件的介面和實現。
FatPkg, FatBinPkgFAT支持包。

原文連結:https://blog.csdn.net/u011057409/article/details/117636656

UEFI API

FeaturePcdGet

FeaturePcdGet(PcdHelloWorldPrintString) 查看在PcdHelloWorldPrintString 是否可用。

Print()

Print函數定義在 UefiLib.h 裡有聲明,其作用為打印字符串。

PcdGetPtr()

PcdGetPtr(PcdHelloWorldPrintString) 讀取在PcdHelloWorldPrintString 的字串。

uefi_learning.1712459890.txt.gz · 上一次變更: 2024/04/07 11:18 由 don