BIOS/UEFI基础——EDK框架

什么是EDK

EDK全称EFI Developer Kit,它实际上是一套实现了UEFI标准的开源代码,开发者可以在此基础上开发UEFI下的设备驱动或者其它应用。

EDK发展到现在已经经历了几代了,早期有EFK,后来是EDK,到现在的EDKII。EDKII兼容EDK,目前这两者都有使用,并且通常会混合使用。

本文主要以EDKII为介绍对象。

 

下载

EDK是开源的,因此可以在网上下载到。在GitHub或者SourceForge上都可以找到相关的代码。

GitHub地址:https://github.com/tianocore/edk2

SourceForge地址:https://sourceforge.net/projects/edk2/?source=directory

 

EDK的架构

下面是EDKII的目录结构:

BIOS/UEFI基础——EDK框架_第1张图片

除了配置和编译工具之外,EDKII的其它部分都是一个个的Package,以xxxPkg为名。

xxPkg将EDKII代码分成了一个个的大模块,如下图所示:

BIOS/UEFI基础——EDK框架_第2张图片

各个模块之间可以独立编译,不过某些模块需要依赖于其它的模块:

BIOS/UEFI基础——EDK框架_第3张图片

由于Package的个数在不断增加,比如上面的代码是2016年下载的,相比我上一份下载的2014年的代码,xxPkg已经多了不少了,所以上图并没有完整得包含左右的Package。从上图中可以看到有几个模块比较基础,尤其是MdePkg和MdeModulePkg,他们提供了UEFI的基础。

打开某个xxPkg,以ShellPkg为例:

BIOS/UEFI基础——EDK框架_第4张图片

其中有一个同名的.dsc文件,通常编译的时候会指定一个.dsc文件,表示编译该目录下的代码。.dsc文件中包含了大量的inf文件,它们是编译的最小单位,通常表示的就是一个模块:

BIOS/UEFI基础——EDK框架_第5张图片

除了.dsc文件和.inf文件,EDKII中还有一个比较重要文件是.fdf文件,它负责确定哪些模块是会被放到UEFI二进制中的,当然前提是这些模块已经通过.dsc文件指定编译。

简而言之,模块是EDKII的最小单位,它表示的可以是一个驱动或者驱动的一部分,也可以是提供某些功能的库或者Protocol(Protocol是UEFI中的一个编程模型,类似与面向对象编程里面的类),每个模块包含一个.inf文件用来指定源代码和入口;.dsc文件用来将.inf文件组织起来进行编译,.fdf文件也是用来将.inf文件组织起来,但是它的目的是为了整合成完整的二进制。

从.inf/.dsc/.fdf到二进制的编译过程大致如下:

BIOS/UEFI基础——EDK框架_第6张图片

这中间的Parsing Tool是用Python脚本、C、C++等写成的,可以在BaseTools目录下找到所有的工具和使用方法。

 

以上是关于EDK框架的介绍,具体的编译可以参考下面的文章:

UEFI实战——OVMF基础

UEFI实战——在Windows下运行UEFI BIOS(Nt32篇)

 

你可能感兴趣的:(UEFI开发基础)