什么是EDK
EDK全称EFI Developer Kit,它实际上是一套实现了UEFI标准的开源代码,开发者可以在此基础上开发UEFI下的设备驱动或者其它应用。
EDK发展到现在已经经历了几代了,早期有EFK,后来是EDK,到现在的EDKII。EDKII兼容EDK,目前这两者都有使用,并且通常会混合使用。
本文主要以EDKII为介绍对象。
下载
EDK是开源的,因此可以在网上下载到。在GitHub或者SourceForge上都可以找到相关的代码。
GitHub地址:GitHub - tianocore/edk2: EDK II
SourceForge地址:EDK II download | SourceForge.net
EDK的架构
下面是EDKII的目录结构:
除了配置和编译工具之外,EDKII的其它部分都是一个个的Package,以xxxPkg为名。
xxPkg将EDKII代码分成了一个个的大模块,如下图所示:
各个模块之间可以独立编译,不过某些模块需要依赖于其它的模块:
由于Package的个数在不断增加,比如上面的代码是2016年下载的,相比我上一份下载的2014年的代码,xxPkg已经多了不少了,所以上图并没有完整得包含左右的Package。从上图中可以看到有几个模块比较基础,尤其是MdePkg和MdeModulePkg,他们提供了UEFI的基础。
打开某个xxPkg,以ShellPkg为例:
其中有一个同名的.dsc文件,通常编译的时候会指定一个.dsc文件,表示编译该目录下的代码。.dsc文件中包含了大量的inf文件,它们是编译的最小单位,通常表示的就是一个模块:
除了.dsc文件和.inf文件,EDKII中还有一个比较重要文件是.fdf文件,它负责确定哪些模块是会被放到UEFI二进制中的,当然前提是这些模块已经通过.dsc文件指定编译。
简而言之,模块是EDKII的最小单位,它表示的可以是一个驱动或者驱动的一部分,也可以是提供某些功能的库或者Protocol(Protocol是UEFI中的一个编程模型,类似与面向对象编程里面的类),每个模块包含一个.inf文件用来指定源代码和入口;.dsc文件用来将.inf文件组织起来进行编译,.fdf文件也是用来将.inf文件组织起来,但是它的目的是为了整合成完整的二进制。
从.inf/.dsc/.fdf到二进制的编译过程大致如下:
这中间的Parsing Tool是用Python脚本、C、C++等写成的,可以在BaseTools目录下找到所有的工具和使用方法。
以上是关于EDK框架的介绍,具体的编译可以参考下面的文章: