EDK2之模块加载—如何从FD中查找出特定固件卷文件FF?

如何从FD中查找出特定固件卷文件FF?


1 基本概念及用法

FD:固件设备,指任何可以存储固件的设备或设备的集合,它存储代码和数据。

FV:固件卷,指在FD上一个连续的部分,我们可以把它看成一个逻辑设备,因为我们代码真正操作的是FV,而非FD。我们经常提到的FFS的概念也是以FV的形式存在,它描述了FV中的文件组织方式。FV之于FD,类似于thread之于package。

FF:固件文件,指在FV中组织代码和数据的一个集合。我们在PEI和DXE阶段都要Dispatch Modules,这个Modules指的就是FF。

2.如何找FF

要想找到FF,首先要找到FV,然后在FV中搜索是否有这个FF存在。我们来看一下DxeLoad中,如何找到Dxe Core的入口函数。

路径:mdemodulepkg\core\dxeiplpeim\dxeload.c(udk2014)

EFI_PEI_FILE_HANDLE
DxeIplFindDxeCore (
  VOID
  )
{
  EFI_STATUS            Status;
  UINTN                 Instance;
  EFI_PEI_FV_HANDLE    VolumeHandle;
  EFI_PEI_FILE_HANDLE   FileHandle;
  Instance    = 0;
  	
  while (TRUE) {
  	Status =PeiServicesFfsFindNextVolume (Instance, &VolumeHandle);
  	if (EFI_ERROR(Status)) {
  	 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_MODULE |EFI_SW_PEI_CORE_EC_DXE_CORRUPT));
 	 }
      
     ASSERT_EFI_ERROR (Status);
     FileHandle =NULL;
     Status =PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_DXE_CORE, VolumeHandle,&FileHandle);
   
     if (!EFI_ERROR(Status)) {
       returnFileHandle;
     }
    Instance++;
  }
}

PeiServicesFfsFindNextVolume(Instance,&VolumeHandle)是在检索系统中的FV,利用Instance参数。如果返回ERROR状态,那么说明FV已经全部被检索完毕。如果成功找到Instance的FV,就会返回FV的Handle VolumeHandle。接着就可以通过PeiServicesFfsFindNextFile(EFI_FV_FILETYPE_DXE_CORE,VolumeHandle, &FileHandle)函数,找到该FV中file type为EFI_FV_FILETYPE_DXE_CORE的FF,返回其FileHandle。

当然这个FF属于DXE Core,比较特殊,具有唯一性。如果是一般的Module,最好用FfsFindFileByName函数,利用FF的Name,即GUID来找到其FileHandle。

3.相关函数介绍

3.1 FfsFindNextVolume

查找FV

EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_NEXT_VOLUME2) (
  IN CONST  EFI_PEI_SERVICES  **PeiServices,
  IN UINTN                    Instance,
  IN OUTEFI_PEI_FV_HANDLE    *VolumeHandle
  );

PeiServices : EFI_PEI_SERVICES表的指针
Instance : 要查找的FV实例。一般说来,该值为0时,FV指BFV,PEI Core就存在于BFV中。
VolumeHandle :如果FV存在,该参数为该FV的FvHandle。

3.2 FfsFindNextFile

在FV中查找FF

typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_NEXT_FILE2) (
  IN CONST  EFI_PEI_SERVICES        **PeiServices,
  INEFI_FV_FILETYPE               SearchType,
  IN CONSTEFI_PEI_FV_HANDLE        FvHandle,
  IN OUTEFI_PEI_FILE_HANDLE       *FileHandle 
  );

PeiServices : 指向EFI_PEI_SERVICES表的指针
SearchType : 文件类型,利用该参数,可以找出这个类型的FF。
FvHandle : FV的Handle,通过FfsFindNextVolume获取。
FileHandle : 要查找的FF的Handle。

3.3 FfsFindFileByName

在FV中查找FF

typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_BY_NAME)(
  IN  CONST EFI_GUID            *FileName,
  IN  EFI_PEI_FV_HANDLE          VolumeHandle,
  OUTEFI_PEI_FILE_HANDLE        *FileHandle
  );

FileName : 指向GUID的指针,该GUID为文件名。
VolumeHandle : FV的Handle,通过FfsFindNextVolume获取。
FileHandle : 要查找的FF的Handle。

4. FV综述

4.1 FDF描述文件

在EDKII中,FDF描述了整个FD,以及各个FV。我们想要了解FD中都有哪些FV时,只要查看FDF文件即可。

在[FD]条目中,有FD们region layout列表,它的格式为:

Offset | Size
[PcdOffCName |PcdSizeCName]
[RegionType]

RegionType为FV的,就是我们想要找的Firmware Volume,编译过后,会在编译目录的FV目录中生成N个.FV文件。

4.2 生产者GenFds

FDF描述文件写完后,谁来使用呢?我在UDK BaseTools一章中,有贴一张图。GenFds –f XXX.fdf。也就是说GenFds负责解析FDF文件,并生成最终的FD。

4.3 FfsFindNextVolume的资源从何处来

在PEI阶段,代码直接使用FfsFindNextVolume获取FVHandle。而它使用什么资源,延长处理这些资源,而后返回FvHandle呢?答案是:Hob,代码在建立HOB时,会建立EFI_HOB_TYPE_FV类型的HOB,这些HOB的BaseAddress和Length来源于Pcd,也是在Fdf文件中最终赋的值。

在Xilinx工程文件调用EDK(Embedded Development Kit)模块的步骤如下: 1. 首先,确保已经创建并配置了EDK工程,并且已经成功生成了EDK系统的位文件(bitstream)和硬件描述文件(.hdf文件)。 2. 在Xilinx工程文件,选择需要调用EDK模块的位置。通常,这可以是一个VHDL或Verilog源文件。 3. 在该位置插入一个IP核(IP Core)。IP核是EDK模块的软件表达形式。可以在Xilinx IP目录选择已经生成的IP核,或者自定义生成一个新的IP核。 4. 打开IP核的配置对话框,该对话框可用于设置IP核的参数和连接。根据需要,设置IP核的各种配置选项,例如输入输端口数量、位宽等。确保设置与EDK系统生成的IP核的参数匹配。 5. 将EDK系统的硬件描述文件(.hdf文件)添加到Xilinx工程。这些文件用于描述EDK系统各个IP核之间的连接关系。 6. 在VHDL或Verilog源文件实例化刚刚插入的IP核,并根据需要设置其连接。可以使用IP核配置对话框指定的端口名称进行连接。例如,使用signal语句或wire语句将IP核和其他模块连接起来。 7. 在Xilinx工程进行综合、实现和生成比特流文件的过程。确保选择正确的目标设备和约束文件。 8. 最后,生成的比特流文件可以烧录到目标设备上,并通过EDK模块进行测试和应用。 需要注意的是,以上步骤仅适用于在Xilinx FPGA上使用EDK模块。对于其他类型的硬件平台和开发工具,可能需要使用不同的方法来调用EDK模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老衲不依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值