UEFI学习之工程模块文件

引言:从"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指令:指定包含的模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值