UEFI FD 文件分析

本文介绍了UEFI FD的生成流程,包括GenSec、GenFfs、GenFv和GenFds四个步骤,强调了FDF文件在定义FD布局中的关键作用。FDF文件用于描述FD的规则,包含Define Section和FD Section等,用于设置如BaseAddress、Size等参数。FV Section则定义了FV的结构,包括Block、FV Set、INF和FILE等语法。INF和FILE关键字分别用于引用模块和FFS文件,决定了它们在FD中的排列顺序。

FD 生成流程

                                 《edk2-BuildSpecification-release-1.28 p.173》

上图是 UEFI edk2 spec 中 《Overview of Flash Device Layout》时序。

  • GenSec: 用于生成 Sec section, Sec 的定义在 FDF 文件中
  • GenFfs: 用于生成 FFS 文件,它是构成FV的基础文件,其生成规则定义在 FDF文件
  • GenFv: 用于生成 Fv 文件,它定义 FFS 在 Fv 中存放的方式和规则
  • GenFds: 用于生成 Fd 文件

根据上述流程描述,一个重要规则是 FDF 来定义的。

FD layout 定义

FDF

                                《edk2-FdfSpecification-release-1.28.01 P.25》 

FDF文件用于描述整个 FD 生成的规则。

通常在进行编译时, FDF 文件 和 DSC 文件位于同一级目录,DSC 中描述中编译各个EFI 文件,之后通过Tools 生成 FD images.

整体流程可以整理如下:

 FDF语法

Define Section

[Defines]
    DEFINE FVMAIN_COMPACT_SIZE  = 0x2ff000

Define section 通常用于定义全局的变量。上面就是定义了一个 FVMAIN_COMPACT_SIZE 的全局变量,这个变量在后面的编译中用到。

FD Section

FD 的语法规则如下:

Token = VALUE [| PcdName]

Token 后面的 PcdName 是可选的,如果后面有 PcdName , 那么会将 VALUE 赋值给 PcdName.

FD 支持的 Token限定为如下的几个:

  • BaseAddress : flash device 的 基地址
  • Size : flash device 的大小,单位是 Bytes
  • ErasePolarity : 擦写极性,只有0或者1 两种数值
  • BlockSize: 支持定义多个 BlockSize, 如果有多个 BlockSize, 通常第一个 size 是 block0 的,之后依次是 block 1:N
  • NumBlocks: 连续 block 的个数

典型定义如下:

[FD.XXX_EFI]
BaseAddress   = 0x80000000|gXXXTokenSpaceGuid.PcdEmbeddedFdBaseAddress  #The base address of the FLASH Device.
Size          = 0x002A0000|gXXXTokenSpaceGuid.PcdEmbeddedFdSize         #The size in bytes of the FLASH Device
ErasePolarity = 1
BlockSize     = 0x1000
NumBlocks     = 0x2A0

FV Section

定义方式:[FV.UiFvName], 其中 UiFvName 是通常是 FVMAIN_COMPACT.

语法规则:

  1. DEFINE 语法: 用于定义FV SECTION 中使用的宏变量。
DEFINE EDK_VERSION = 10

Block 语法

BLOCK_SIZE = VALUE
NUM_BLOCKS = VALUE

FV  Set 语法

SET <PcdName> = VALUE

用于定义 Pcd 变量

  1. INF 语法

INF 用于引用 edk2 inf 文件或者component。在 FV section 使用 INF 会默认创建一个引用 module 的 inf 文件中设定的 MODULE_TYPE 的 ffs 文件。

同时,在 FV.FVMAIN_COMPACT 之后定义的 INF 顺序规定了相关的 module 的在 FD 中的顺序。

  1. FILE 语法

FILE 关键字用于引用 ffs 文件,格式如下:

FFS file specification syntax is one of the following:
FILE Type $(NAMED_GUID) [Options] FileName
OR
FILE Type $(NAMED_GUID) [Options] {
    SECTION SECTION_TYPE = FileName
    SECTION SECTION_TYPE = FileName
}

引用文件的类型定义如下:

 

 Named_GUID 通常是从 INF file's [Defines] section FILE_GUID 获取得到。

参考

EDK II Documentation · tianocore/tianocore.github.io Wiki · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值