您的位置:首页 > 其它

EFI基本概念之FV

2016-02-15 14:38 267 查看
1 基本概念及用法
FD:固件设备,指任何可以存储固件的设备或设备的集合,它存储代码和数据。
FV:固件卷,指在FD上一个连续的部分,我们可以把它看成一个逻辑设备,因为我们代码真正操作的是FV,而非FD。我们经常提到的FFS的概念也是以FV的形式存在,它描述了FV中的文件组织方式。FV之于FD,类似于thread之于package。
FF:固件文件,指在FV中组织代码和数据的一个集合。我们在PEI和DXE阶段都要Dispatch Modules,这个Modules指的就是FF。

1.1 如何找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。

1.2 相关函数介绍
1.2.1
FfsFindNextVolume
查找FV
typedef
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。

1.2.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。

1.2.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。

2 FV综述
2.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文件。

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

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

(完!没有写DXE协议处理FV的部分,其实原理也差不多。新年第一篇,祝愿所有的老年人健康平安!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: