1. FV、FFS、Section等相关概念及结构组成的资料在哪里查找?
a. 在网站https://uefi.org/sites/default/files/resources/PI_Spec_1_7_A_final_May1.pdf 中下载PI文档,在此文档Volume 3章中的2 Firmware Storage Design Discussion节、3 Firmware Storage Code Definitions节中有相关资料。
b. 在EDKII代码工程如下路径的文件里有详细的相关结构体内容描述:
edk2/MdePkg/Include/Pi/PiFirmwareFile.h
edk2/MdePkg/Include/Pi/PiFirmwareVolume.h
edk2/MdePkg/Include/IndustryStandard/PeImage.h
2. 编译出来的模块xx.efi文件是什么格式的文件?
a. xx.efi是PE32格式文件。
3. 为什么Flash中的BIOS程序不但能直接在Flash中运行,而且也能搬运到内存的任何地方执行?
a.EDKII编译的模块程序以PE格式组织放在Flash中FFS文件系统中,而PE格式的代码是可以进行基址重定位,从而实现代码转移到别的地址运行。
4. 为什么Firmware File Secion类型中可执行文件有PE、TE二种格式,这二种格式的可执行文件在Flash中是怎么存放的,又是怎样的执行顺序,是不是可以随意用这二种格式?
a. SEC阶段,程序上电首先是在Flash的某个特定地址中直接取指令执行,然后初始化CPU,把CPU的Cache设置当成RAM,这部分代码是直接在Flash中运行的,此部分的汇编程序段必定是TE格式的程序。
b. PEI阶段,CPU的Cache已初始化后,C语言环境也建立起来,但是要求此阶段运行的代码尽可能的少,所以这个阶段的各个模块的程序段也是TE格式的程序。
c. 进入DXE及后续阶段,各个模块的程序段都是PE格式的程序。
5. EDKII中xx.inf模块最后编译出来是以怎么样形式在Fash中存放的,有什么规律?
a. xx.inf模块编译出来的文件,根据fdf中的[rule.common.XX]规则,把这个模块生成的xx.efi,xx.depx,xx.ui等文件,通过basetoool相关工具,每个文件加Section头,加FFS头,最后生成一个FFS文件。
b. 每个FFS文件只有一个PE32格式的Section, 也只有一个depex格式的Section。
c. depdex格式的Section一定在PE32格式的Section的前面。
6. 飞腾D2000的BIOS程序的第一条指令是怎么执行的,执行的第一个模块是哪个模块?
a. 飞腾D2000开发板第一条指令是在Flash的0x00000000地址的前四个字节执行,
这是一条跳转指令 汇编代码 “b #0x20”; 因为飞腾D2000开发板的前面有一段程序是PBF, 这段bin是飞腾公司自己开发的,所以真正飞腾D2000的BIOS程序代码是从Flash的0x180000地址开始。飞腾PBF程序执行完后程序代码跳到0x180000地址,这个地址的前四个字节也是个跳转指令”b #0x200”, 通过这个指令发现程序在0x180000 + 0x800处执行BIOS程序,这部分代码是在 edk2/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf模块里的文件edk2/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S中执行程序代码。




