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.
  • 39
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 UEFI BIOS 中添加子界面可以通过以下步骤完成: 1. 打开 edk2 代码文件夹,在路径 `MdeModulePkg/Universal/Setup/` 下创建一个新的目录,作为子界面的存储位置。 2. 在新创建的目录中创建一个 `Setup.inf` 文件,用来描述子界面的信息,包括名称、GUID、版本号等。 3. 在 `Setup.inf` 文件中添加以下内容: ``` [Defines] INF_VERSION = 0x00010005 BASE_NAME = MySubMenu FILE_GUID = 01234567-89AB-CDEF-0123-456789ABCDEF MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 1.0 ENTRY_POINT = MySubMenuEntryPoint UNI_FILE_LIST = MySubMenu.uni [Sources] MySubMenu.c [Packages] MdePkg/MdePkg.dec [LibraryClasses] UefiApplicationEntryPoint UefiLib ``` 其中,`BASE_NAME` 表示子界面的名称,`FILE_GUID` 表示子界面的唯一标识符,需要使用 GUID 工具生成;`ENTRY_POINT` 表示子界面的入口函数,需要在代码中实现;`UNI_FILE_LIST` 表示子界面的菜单项列表,需要在代码中创建。 4. 创建子界面的 C 代码文件 `MySubMenu.c`,并在其中实现子界面的逻辑和菜单项列表。例如: ``` #include <Uefi.h> #include <Guid/MdeModuleHii.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/HiiLib.h> EFI_STATUS EFIAPI MySubMenuEntryPoint(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; EFI_HII_HANDLE HiiHandle; EFI_STRING_ID MySubMenuTitle; EFI_GUID MySubMenuGuid = {0x01234567, 0x89ab, 0xcdef, {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}}; // Create HII handle Status = HiiInitializeProtocol(); if (EFI_ERROR(Status)) { return Status; } // Add menu title MySubMenuTitle = HiiSetString(HiiHandle, 0, L"My Sub Menu Title", NULL); if (MySubMenuTitle == 0) { return EFI_OUT_OF_RESOURCES; } // Add menu items HiiCreateAction(HiiHandle, 0, MySubMenuTitle, 0, 0, 0, NULL, NULL); HiiCreateAction(HiiHandle, 0, MySubMenuTitle, 1, 0, 0, NULL, NULL); HiiCreateAction(HiiHandle, 0, MySubMenuTitle, 2, 0, 0, NULL, NULL); return EFI_SUCCESS; } ``` 其中,`HiiInitializeProtocol()` 用来初始化 HII 协议;`HiiSetString()` 用来添加菜单标题;`HiiCreateAction()` 用来添加菜单项。 5. 创建子界面的菜单项列表 `MySubMenu.uni`,并在其中定义菜单项的名称和描述。例如: ``` # LANGUAGE en-US MySubMenuTitle = "My Sub Menu Title"; MySubMenuItem1 = "My Sub Menu Item 1"; MySubMenuItem2 = "My Sub Menu Item 2"; MySubMenuItem3 = "My Sub Menu Item 3"; ``` 6. 重新编译 edk2 代码,生成新的 UEFI BIOS 镜像文件,子界面将会出现在 UEFI Setup 菜单中。 需要注意的是,子界面的菜单项名称和描述需要根据实际需要进行修改,同时需要保证子界面的 GUID 和菜单项的 ID 是唯一的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值