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文件中最终赋的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老衲不依

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

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

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

打赏作者

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

抵扣说明:

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

余额充值