UEFI规范中提出了两个重要的概念——模块(Module)和包(Package)。
模块是UEFI上最小的可单独编译的代码单元,或是预编译的二进制文件,比如efi执行文件。它包含了inf文件、源代码和二进制文件,其中,inf文件用来描述模块的行为,比如产生库、产生Protocol(UEFI协议接口)、使用库,指明唯一标识符等。
包由模块、平台描述文件(DSC文件)和包声明文件(DEC文件)组成,他们可以不包含模块,也可以包含很多模块。如EDK2目录下的MdeModulePkg和EmulatorPkg。DSC文件相当于sln文件,用来描述多个工程的信息;
1、EDK2文件关系
打开EDK2文件夹,可以发现里面包含很多个以Pkg结尾的文件夹,这样的文件夹称为package,package和package之间可能存在依赖,Pkg文件夹下有很多个Module(模块),模块是EDK2中最小可编译单元。
package里面都有.dsc文件,可能有.dec文件、.fdf文件。
1.1 DSC文件
DSC文件是edk2的平台描述文件,用来描述和编译包。DSC文件描述了模块、库和组件如何编译,其中还包含了很多节(Session)标志、包括必要的[Defines]、[Componments]和可选的[LibraryClasses]、[Libraries]、[SkuIds]、[BuildOptions]、[PCD]、[UserExtensions]、[DefaultScores]。所有节的标志都内置于中括号中,而且大小写是敏感的。
Defines:定义了各种变量,以供后续使用,有必要项和可选项
BuildOptions:给出编译器和相关的编译参数
LibraryClasses:用来提供模块所使用的库入口,而且它允许将模块编译成库,这些库可以被[Components]中的模块使用。
Components:用来定义模块编译的节,通过指定模块的INF文件所在的位置,Build工具可以编译生成efi文件。
1.2 DEC文件
每个包只有一个DEC文件,一般和DSC文件成对出现,DEC文件主要声明包的公共数据和接口。
1.3 INF文件
INF文件是模块的工程文件,其后缀名为.inf,描述了模块的属性,包括模块是哪些代码组成、提供了什么、依赖什么库、支持什么CPU架构等信息。EDK2的模块一般位于包的子目录下,提供库的模块一般位于Library子目录下,UEFI_APPLIACTION的例子,一般位于Applications下。
例如:HelloWorld模块的inf文件
1.4 FDF文件
用于描述固件在Flash中的布局和位置,作用是规定把哪些包编入flash中,并确定编入的位置。
1.5 IDF、UNI、VFR文件
IDF图像描述文件
UNI宽字节字符串文件
VFR可视化窗体描述
2、EDK2代码编译流程
1、DEC文件用来配合DSC文件,描述包的公开数据和接口;IDF、UNI、VFR文件可算作资源文件;INF文件配合源代码和资源文件,在Build工具的协助下,生成二进制文件(如efi文件、lib文件)。
2、FDF文件与DSC文件和二进制文件配合生成镜像。
3、总结
dsc文件:edk的平台描述文件,用来描述和编译包。会定义一些变量,设置编译器参数,模块所使用的库的路径,所包含的模块,在编译一个模块的时候,会将模块的inf文件添加到包的dsc文件中。
dec文件:包声明文件,声明包的公共数据和接口,有包提供的头文件的所在目录,库和头文件的对应关系、Protocol的GUID、GUID常量等。
inf文件:模块的工程文件,用来描述模块的属性,里面会定义模块的变量,源文件、所引用的包的dec文件、所用的库、protocol、ppi、pcd等。
fdf文件:描述固件在flash的布局和位置等,有fd、fv、option Rom组成,fd就是固件设备,能够构成一个完整的镜像文件,包含fd基址、fd大小等信息,fv是固件的逻辑区块,相当于fd的分区。定义了镜像包含的组件和模块,和用来编译其它独立固件的Option ROM。
资源文件:IDF(图像描述文件)、UNI(宽字节字符串文件)、VFR(可视化窗体描述)