目录
EDK环境安装

EDK代码下载
需要安装git和TortoiseGit
切换Branch或Tag
下载第三方依赖包
CryptoPkg\Library\OpensslLib\openssl
BaseTools\Source\C\BrotliCompress\brotli
MdeModulePkg\Library\BrotliCustomDecompressLib\brotli
编译Windows工具
•Edksetup.bat rebuild
生成编译所需工具 BaseTools\Bin\Win32
Build 命令
编译项目
ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc
TARGET = DEBUG (RELEASE)
TARGET_ARCH = IA32 (X64/IA32/ARM)
TOOL_CHAIN_TAG = VS2015x86 (VS2015)
MAX_CONCURRENT_THREAD_NUMBER = 8 (1/2/4)
build -a IA32 -p EmulatorPkg\EmulatorPkg.dsc -t VS2015x86
编译模块
Build –a X64 –t VS2015 –m ShellPkg\Application\Shell\Shell.inf –p ShellPkg\ShellPkg.dsc

-- 编译结果:
Build\Shell\DEBUG_VS2015\X64\ShellPkg\Application\Shell\Shell\OUTPUT
build -a X64 -a IA32 -t VS2015 -b DEBUG -m CryptoPkg\Library\OpensslLib\OpensslLib.inf -p CryptoPkg\CryptoPkg.dsc
DSC (•Platform Description (DSC) File)
ØThe DSC file is used by EDKII built tools as a starting point in the platform build process.
AMI : Build/Platform.dsc ( Generate platform DSC file using information from VEB, CIF, and SDL files )
EDKII: xxxPkg/xxx.dsc
<EDK_II_DSC> ::= [<Header>] <Defines> [<SkuIds>] <Libraries>* <LibraryClasses>* <Pcds>* <Components>+ <BuildOptions>* <UserExtensions>*
--注释描述说明
设置 build 相关的全局变量,这些变量可以被 .dsc 文件的
其他模块引用,必须是 .dsc 文件的第一部分
•3.[BuildOptions] Section (optional)
--指定本模块/项目的编译和连接选项
[编译器家族]:[$(Target)]_[TOOL_CHAIN_TAG]_[$(Arch)]_[CC|DLINK]_FLAGS[=|==]选项
[BuildOptions] Section in INF module:
4.[SkuIds] Section (optional)
•匹配SKUID_IDENTIFIER可以对不同的Sku设置不同的pcd值等

格式:
[LibararyClasses.$(Arch).$(MODULE_TYPE)]
LibraryName | path/LibraryName.inf、
$MODULE_TYPE 表示模块的类别,支持以下模块类型:
SEC、PEI_CORE、PEIM、DXE_CORE、DXE_SAL_DRIVER、BASE、DXE_SMM_DRIVER、DXE_DRIVER、
DXE_RUNTIME_DRIVER、UEFI_DRIVER、UEFI_APPLICATION、USER_DEFINED
•7 [Components] Section (required)
--模块编译生成.efi文件
--存放相对路径的模块 inf 文件
--可以嵌套 LibraryClasses/Pcd*/BuildOptions等
•8.[PCD] Section (optional)
--定义平台配置数据,在不改动 .inf 文件和源文件的情况下完成对平台的配置(Override)
--需要在DEC文件中提前定义声明
•9.[UserExtensions] Section (optional)
--用户自定义区域,EDKII 编译工具会忽略,用户可以添加工具进行解析
FDF(•Flash Description (FDF) File )
• --与 DSC 文件中FLASH_DEFINITION匹配
AMI : Build/Platform.fdf ( Generate platform fdf file using information from VEB, CIF, and SDL files )
EDKII: xxxPkg/xxx.fdf
<EDK_II_FDF> ::=
[<Header>]
[<Defines>]
<FD>*
<FV>*
<Capsule>*
<FmpPayload>*
<VTF>*
<Rules>*
<OptionRom>*
<UserExtensions>*
--定义fdf文件版本,定义PCD值,变量预定义等
•[FD] Sections (required)
$(OUTPUT_DIRECTORY)/$(TARGET)_$(TAGNAME)/FV
FD TOKEN
FD DEFINE
FD SET
FD Region(定义存放layout及内容
--每个FDF有一个或者多个FV
--FV section中的inf模块最终会编译到对应的FV中
--FV需要与FD中FD Region对应
--定义编译模块输入输出规则
-- 可以对单独的模块做RuleOverride
-- SEC/PEI模块及直接包的bin文件等不需要压缩
INF
• Module Information (INF) File•Declaration (DEC) File Format
PCD
•Platform Configuration Database
类型:
PCD的全称是Platform Configuration Database,它是一个存放了UEFI下可访问数据的数据库。
它的特点是可以在UEFI存在的大部分时间内访问,在【UEFI实战】在库中使用全局变量中就曾经介绍过通过PCD来传递全局变量。这里说是大部分时间内,那是因为在诸如SEC阶段,以及PEI、DXE阶段的早期,某些PCD相关的模块还没有加载起来之前,这些类型的PCD还是不能访问的。
TokenSpaceGuidCName.PcdCName
TokenSpaceGuidCName是一个GUID,PcdCName是一个变量名,两者合起来构成了唯一的PCD变量。
PCD的类型
FeatureFlag PCD:它最终返回的是一个TRUE或者FALSE,用于判断条件中;FeatureFlag PCD跟FixedAtBuild是一样的,它相当于类型是BOOELAN的FixedAtBuild PC
PatchableInModule PCD:这种变量的值可以在编译的时候确定,这个不算特别,特别的是它可以在编译完成的二进制文件上通过工具来修改值;
FixedAtBuild PCD:静态值,在编译的时候确定,整个UEFI阶段不可变;
Dynamic PCD:前面的三种类型可以认为是静态的PCD,而这里以及之后的是动态的PCD;它的特点是可以在UEFI运行的过程中通过Set宏来修改值;在《edk-ii-build-specification.pdf》中有说明该种类型的PCD必须在DSC中在列一遍,但是实际使用似乎并不是必须的;
DynamicEx PCD:跟Dynamic PCD类似,算是加强版,使用宏PcdGetEx/PcdSetEx来访问变量;
需要注意的是上面的类型并不是在一个SPEC中定义的,前面的4中是满足EDKII规范,而最后一个满足的是PI规范,这个对使用的影响还不是很确定。

UEFI中,构成这样的窗体的组件大致有四种,分别是Strings,Forms,Fonts和Images,如下图所示:

