引言:从"Hello World"到工程化开发
当开发者首次接触UEFI编程时,往往会被EDK II工程中复杂的文件结构所困惑。从简单的".inf"文件到神秘的".fdf"配置,这些模块文件构成了UEFI开发的基石。本文将深入解析UEFI工程的核心模块文件,助你从"代码实验"迈向"工程化开发"。
一、EDK II工程结构全景图
1.1 典型工程目录结构
MyUefiPkg/
├── MyDriver/
│ ├── MyDriver.c
│ ├── MyDriver.h
│ └── MyDriver.inf # 模块声明文件
├── MyApplication/
│ ├── Main.c
│ └── MyApplication.inf
├── MyPkg.dec # 包声明文件
├── MyPkg.dsc # 平台描述文件
└── MyPkg.fdf # 固件描述文件
1.2 四大核心文件类型
-
.inf :模块工程文件
-
.dec:包资源声明书
-
.dsc:工程构建蓝图
-
.fdf :固件映像配方
二、模块工程文件:.inf文件解析
2.1 INF文件核心结构
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = MyDriver
FILE_GUID = 12E3A372-71F9-4D58-9112-248B24D6B9A1
MODULE_TYPE = UEFI_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = DriverEntry[Sources]
MyDriver.c
MyDriver.h[Packages]
MdePkg/MdePkg.dec
MyPkg/MyPkg.dec[LibraryClasses]
UefiDriverEntryPoint
UefiLib[Protocols]
gEfiLoadedImageProtocolGuid
2.2 关键字段解读
-
INF_VERSION:INF标准的版本号
-
BASE_NAME:生成二进制文件的基础名
-
FILE_GUID:全球唯一标识符(使用uuidgen生成)
-
MODULE_TYPE:定义模块的模块类型(如:UEFI_APPLICATION/DRIVER)
-
ENTRY_POINT:定义模块入口函数
2.3 模块依赖管理
-
Packages:声明依赖的包
-
LibraryClasses:指定链接的库
-
Protocols:声明使用的协议
三、工程构建蓝图:.dsc文件详解
3.1 DSC文件架构示例
[Defines] PLATFORM_NAME = MyPlatform PLATFORM_GUID = 3E7D283C-3D79-4A91-AC07-8235A4F3D7B9 PLATFORM_VERSION = 1.0 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/MyPlatform [LibraryClasses] UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf [Components] MyPkg/MyDriver/MyDriver.inf MyPkg/MyApplication/MyApplication.inf [BuildOptions] MSFT:*_*_*_CC_FLAGS = /D MDEPKG_NDEBUG GCC:*_*_*_CC_FLAGS = -DMDEPKG_NDEBUG
3.2 核心功能区域
-
LibraryClasses:全局库映射
-
Components:包含的模块列表
-
BuildOptions:编译器参数配置
-
Pcds:平台配置数据库设置
四、固件映像配方:.fdf文件解密
4.1 FDF文件结构示例
[FD.MY_FIRMWARE] BaseAddress = 0x00000000 Size = 0x00200000 ErasePolarity = 1 0x00000000|0x00010000 FV = FVMAIN [FV.FVMAIN] BlockSize = 0x1000 FvAlignment = 8 INF MyPkg/MyDriver/MyDriver.inf INF MyPkg/MyApplication/MyApplication.inf [Rule.Common.UEFI_DRIVER] FILE DRIVER = $(NAMED_GUID) { SECTION PE32 = $(OUTPUT_DIR)/$(BASE_NAME).efi SECTION UI = "My Driver" }
4.2 关键配置解析
-
FD区域:定义固件设备布局
-
FV区域:配置固件卷内容
-
Rule区块:设置构建规则
-
INF指令:指定包含的模块