EDKII编译初试
一、core中的各个package
看了书上的EDKII的编译环境和EDKII的core中含有的各个package,每个package的作用,包含的东西以及各个package之间的相互联系。以下是EDKII中包含的package:
BaseTool:提供二进制文件编译和配置文件模板构建的工具
Conf:只含有一个readme.txt的文件,该目录用于包含配置文件的编译目标和用于创建的编译参数。
MdePkg:声明PROTOCOL、PPIs、GUID、定义在UEFI和EFI中的数据结构、PI规格和行业标准。另外该软件包包含在模块开发环境中含有的库实例,在intel为EFI创建的平台创新架构上提供所有执行阶段提供的服务。
MdeModulePkg:提供了一组基于UEFI、EFI和PI规格的交叉平台,同时也包含服务这些模块的库实例。
IntelFrameworkPkg:声明了PROTOCOL、PPIs、GUID和定义在intel为EFI平台创新架构上的相关数据,此外,这个软件包包含了基于平台创新架构上的库实例。
IntelFrameworkModulePkg:提供了一组基于平台创新架构的库实例和模块交叉平台,同时,它也包含服务这些模块的库实例。
EdkShellPkg:提供创建Shell工程的指令。
EdkShellBinPkg:提供可执行shell文件和使用不同CPU架构的可执行shell应用。
EdkFatBinPkg:提供适用于不同CPU架构的可执行FAT驱动。
Nt32Pkg:在32位windows操作系统下执行,提供一个UEFI运行时环境
UnixPkg:运行在32位UNIX类似操作系统上
DuetPkg:基于真实机器传统BIOS上提供UEFI运行时环境
OptionRomPkg:展示相同驱动为不同的CPU架构创建PCI标准可选ROMimage。
EdkCompatibilityPkg(ECP):包含EFI1.10、EFI2.0和所有intel架构规范,加上EDK库实例的EDK风格的定义,用来使得EDK风格模块可以适用于EDK上下文。他也含有一些trunk驱动,提供定义在UEFI2.1/PI1.0中的不同协议和intel创新架构规范之间的过度。ECP的主要目标是在EDKII中兼容创建在EDK模块和解决在预PI-EDK模块在平台EDKII模块中的二进制兼容性问题。
PcAtChipsetPkg:设计和实现遵循PCAT标准的公共接口
UefiCpuPkg:提供兼容CPU模块和库的UEFI
OvmfPkg:支持使用EDKII代码库的虚拟机的固件。
下图反映了EDKII中各个包之间的依赖关系:
图1 包之间的依赖关系图
二、EDK编译工程的一般步骤
第一步:下载EDKII项目作为基础的workspace,并安装所需的工具链。如果必要时,其它模块和包还可以加入到这个工作区。
第二步:在workspace(EDKII根目录),运行脚本edksetup建立构建环境。
第三步:配置活动平台,如编译选项,目标,构建工具链和构建规则。
第四步:调用build命令用来配置上一步中对应的的平台,模块或目标。
第五步:根据配置平台定制要求进行编译。
三、各种类型的文件
*.dec(Package Declaration File)文件:该文件定义了公开的数据和接口,供其他模块使用。包含的必须块[Defines]以及一些可选块[Include]、[LibraryClassess]、[Guids]、[Protocols]、[PCD]和[Pips]等。
*.dsc(Platform Description File)文件:用于编译一个Package。包含的必须块[Defines] 、[LibraryClassess]、[Components]等。类似于上层目录下的MakeFile文件。
*.inf(Device INFormation File)文件,用于编译一个模块Module。相当于子目录下的MakeFile文件,用于动态加载模块。
*.efi:编译模块之后生成的可执行文件,可以使用下载下来,在shell命令下运行在BIOS中。
*.fdf(Flash Description File)文件:用于生成固件Image。Option ROM Image或者可启动的Image。
剩下的就是编写*.c文件了,注意在编写该C应用语言程序的时候,不能直接使用C语言的标准库中的函数,例如printf()之类的函数,如果要使用的话一定要在该工程文件的inf文件中的[Packages]块中添加StdLib/StdLib.dec,而在[LibraryClasses]块中添加LibC、LibStdio和ShellCEntryLib这几个函数库。
四、书写工程文件的注意点
对于C语言程序的编程,注意这是要在shell下运行的可执行程序的员程序,因而我们不能直接使用C语言函数库中的库函数,这点上面红色字体部分已经说明,还有就是在这里我们调用库文件、Protocols、全局变量等时候,我们呢都要在该Package文件目录下的*.dsc文件中的适当位置添加要调用函数所在位置处的*inf文件,里面的文件格式是:文件名|*.inf文件的文件路径。并且要在该工程文件的目录下的*.inf文件中的[Protocols]块添加使用的GUID、[LibraryClassess]块添加使用的函数库、[Packages]块中添加*.dec文件,确保自己所调用的每一个函数、变量、Protocols等都可以通过这些路径之类的东西找到,这样就可以顺利进行编译了。
以上纯属个人见解,不代表权威,若有任何不对的地方,还请各位大神斧正。