EDK代码及编译详细介绍

目录

EDK环境(安装/代码下载/编译工具)

代码编译(项目/模块)

DSC/FDF文件

INF/DEC文件

UNI/VFR文件

编译流程


EDK环境(安装/代码下载/编译工具)

EDK环境安装

安装 VS2015( EWDK)
安装 JAVA(JRE/JDK)
安装 Python27
安装 cygwin64
IASL 编译工具
NASM 编译工具
Link16 工具

EDK代码下载

需要安装gitTortoiseGit

切换BranchTag

下载第三方依赖包

   CryptoPkg\Library\OpensslLib\openssl

2 . brotli :  https://github.com/google/brotli.git

  BaseTools\Source\C\BrotliCompress\brotli

  MdeModulePkg\Library\BrotliCustomDecompressLib\brotli

编译Windows工具

Edksetup.bat rebuild

生成编译所需工具 BaseTools\Bin\Win32

Build 命令

编译项目

修改 Conf /target.txt ( 来源 BaseTools \ Conf \ target.template )

     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)

Terminal 窗口运行: build ( 默认调用 target.txt) 或:

build -a IA32 -p EmulatorPkg\EmulatorPkg.dsc -t VS2015x86

编译模块

1. 编译 Driver 模块

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

1. 编译 Library 模块

build -a X64 -a IA32 -t VS2015 -b DEBUG -m CryptoPkg\Library\OpensslLib\OpensslLib.inf -p CryptoPkg\CryptoPkg.dsc

DSC/FDF文件

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>*

1.[ Header ] Section ( optional )

    --注释描述说明

2.[ Defines ] Section (required)

设置 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值等

5 [ Libraries ] Section ( optional )
    目前已经很少使用,主要为了兼容旧的 EDK 标准模块
6 [ LibraryClasses ] Section ( optional )
-- 定义 了库的名字和库 . inf 文件的 路径

格式:

 [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>*

[Defines] Sections ( optional)

  --定义fdf文件版本,定义PCD值,变量预定义等

[FD] Sections (required)

Build 工具根据 FD 名称生成对应的 . fd 文件,可以有一个或多个 FD 区域

    $(OUTPUT_DIRECTORY)/$(TARGET)_$(TAGNAME)/FV


FD TOKEN

FD DEFINE

FD SET

FD Region(定义存放layout及内容

[FV] Sections (required)

   --每个FDF有一个或者多个FV

    --FV section中的inf模块最终会编译到对应的FV

    --FV需要与FDFD Region对应

[Rules] Sections (optional )

    --定义编译模块输入输出规则

   -- 可以对单独的模块做RuleOverride

   -- SEC/PEI模块及直接包的bin文件等不需要压缩

INF/DEC文件

INF

Module Information (INF) FileDeclaration (DEC) File Format  

PCD

Platform Configuration Database

类型:

FeatureFlag , FixedAtBuild , PatchableInModule , Dynamic, DynamicEx

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规范,这个对使用的影响还不是很确定。

Visual Forms Representation
Unicode Strings File 

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

编译流程

Pre-build or AutoGen stage : parse meta-data files, UCS-2LE encoded files and VFR files to generate some C source code files and the Makefiles .
Build or $(MAKE) stage : process source code files to create PE32/PE32+/COFF images that are processed to EFI format using NMAKE (Microsoft operating system development platforms) or MAKE (for UNIX style operating system development platforms).
Post-build or ImageGen stage : takes the binary, EFI format files and creates EFI "FLASH" images, EFI update capsules, UEFI applications or PCI Option ROMs.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小菜鸟-BIOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值