EDKII官方Spec 合集网站

前言

之前在向代码中添加自己创建的代码时,一直都是在自己创建的 LilyPackage 中创建好相应的 .h .c .inf 文件,然后在 EmulatorPkg.dsc 文件中将 .inf 文件进行包含,一直没有出现问题。但是在创建新的 protocol 的时候,出现了一点问题,就是关于 include 的 TestProtocol.h
在UEFI中,创建新的 protocol 是需要在 .dec 文件中声明对应的GUID 的,我当时的做法是将GUID 在 EmulatorPkg.dsc [Protocols] 下进行声明,并且将自己定义的 .h 文件放在了 EmulatorPkg\Include\Protocol 路径下。但是有人提出,在他的代码中 需要将定义的 .h文件放在 MdePkg\Include\Protocol 路径下才可以得到编译结果 。之前我从来没有关心过文件的路径问题,对于不同类型的文件作用也没有进行深入的研究,借着这个疑问,也终于有机会对这些问题深入的研究一下。

Module & Package 概念

刚刚学习UEFI的人,不能避免的会遇到这两个概念,EDKII的代码组织形式就是以这两个概念为基础的,但是这两个概念在代码结构中的表现却很少有人提起。
我们打开EDKII代码的根目录,就可以看到许多个 .pkg 结尾的文件夹,每一个都是一个package

继续向下 我们就可以看到更多的子文件夹 有的子文件夹就是一个模块 ,但这也并不是绝对的。我们这样可以说是语焉不详,这种模棱两可的表述肯定搞不清楚这两个UEFI中最常见的概念的定义。为了明晰这两个概念,首先先看一下Build Spec (下载链接已经放在开头了 所有的EDKII需要的SPEC基本都能从这个连接中找到 )中对这两个定义的解释:

Module :A module is either an executable image or a library instance. For a list of module types supported by this package, see module type
Module: 是一个可执行image或者一个 lib instance 。某一个package中支持的module类型可以查看module type类型

Package:A package is a container. It can hold a collection of files for any given set of modules.
Packages may be described as one of the following types of modules:

  1. source modules, containing all source files and descriptions of a module
  2. binary modules, containing EFI Sections or a Framework File System and a description file specific to linking and binary editing of features and attributes specified in a Platform Configuration Database (PCD).
  3. mixed modules, with both binary and source modules
    Multiple modules can be combined into a package, and multiple packages can be combined into a single package.

Package:Package是一个容器,他容纳了一系列给定Module的文件的集合。
Package可以被描述成为以下几种类型的Modules的之一:

  1. source modules:包含了一个模块的所有源代码文件和描述文件
  2. 二进制 modules:包含了 EFI section 或者 一个ffs,以及 一个des 文件,专门用来链接和二进制编辑PCD中指定的功能和属性
  3. 混合modules :包含以上两种
    多个modules可以被包含在一个package中,多个package也可以结合成一个package

我觉得Spec里面的解释可以说是非常抽象了 幸亏 我手边有两本参考书 可以看一下书中所言:

  1. 包(package)是一组模块及平台描述文件(dsc)、包声明(dec)文件组成的集合。
    模块(可执行文件,即.efi文件)像插件一样可以动态地加载到UEFI内核中。
  2. 模块是UEFI上最小的可单独编译的代码单元,或是预编译的二进制文件,比如.efi执行文件。
    包由模块、平台描述文件和包声明文件组成。它可以不包含模块,也可以包含多个模块。