Win从零开始搭建EDK II环境

【BIOS】Win从零开始搭建EDK II环境

一、效果体验

运行效果

二、官网说明

地址:https://github.com/tianocore/tianocore.github.io/wiki/Getting-Started-with-EDK-II

Getting Started with EDK II

三、环境准备

1、win10 x86_64位

pc环境

2、VS2017

下载vs2017专业版 (地址:https://msdn.itellyou.cn/

下载Visual Studio Professional 2017

3、Python3.7.8

下载python3.7.8 (地址:https://www.python.org/downloads/windows/)

安装到C:\Python

下载Python 3.7.8

注意:安装的目录名不要有空格。

4、IASL

下载地址:https://acpica.org/sites/acpica/files/iasl-win-20200717.zip

解压到C:\IASL

下载IASL

5、NASM

官网版本库:https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D

下载地址:https://www.nasm.us/pub/nasm/releasebuilds/2.15.02/win64/

安装到C:\NASM

下载nasm-2.15.02-installer-x64.exe

6、EDK II源码

下载源码 :https://github.com/tianocore/edk2/tags

本节使用的是:edk2-stable202002版本

解压到自己的工作目录

下载edk2-stable202002


Laurie Jarlstrom 编辑了此页面 2019 年 5 月 11 日 ·  14次修订

下载和编译代码

本页展示了从 GitHub下载EDK II并在各种 OS/编译器环境下编译项目的步骤。

如何设置本地 EDK II 树

支持并记录了多种构建环境。如果没有针对您的确切系统配置的说明,您仍然可以调整说明以在您的系统上工作。

注意:根据项目或包,可能需要其他一些构建工具:

注意:一些示例使用Multiple_Workspace `PACKAGES_PATH` 特性来配置 EDK II 构建环境。例如,这是使用基于 edk2-platforms 的平台代码所必需的:(https://github.com/tianocore/edk2-platforms)。

运行基本构建环境后,您可以在 RELEASE 或DEBUG模式下构建项目。

GitHub 帮助

GitHub ( https://help.github.com/index.html ) 提供用户注册的分步说明和 GitHub 支持的基本功能

GitHub EDK II 项目存储库

EDK II 开发流程

设置构建环境后,请参阅 EDK II 开发流程以对 EDK II 项目做出贡献。

进一步帮助

如果您对代码有疑问或遇到障碍,请加入 EDK II 开发人员邮件列表 并在列表中询问您的 EDK II 相关问题。

有关编写简单 UEFI EDK II 应用程序的信息,请参阅:开始编写简单应用程序

要查看 .DSC、.DEC 和 .INF 文件的基本设置,请参阅:构建描述文件

视窗系统

 

此页面提供逐步说明或在 Windows 系统上设置EDK II构建环境。

目录

GitHub 帮助

GitHub ( https://help.github.com/index.html ) 提供了用户注册的分步说明和 GitHub 支持的基本功能。

适用于 Windows 操作系统的 Git GUI 界面

GitHub EDK II 项目存储库

未根据公认的开源许可发布的内容可以在https://github.com/tianocore/edk2-non-osi找到。
 
注意:以下步骤将从 edk2 master 拉取最新代码。要使用稳定版本,请参阅UDK2017的 Microsoft Windows 构建步骤:https : //github.com/tianocore/tianocore.github.io/wiki/UDK2017-How-to-Build#how-to-build-视窗系统

互联网代理

如果您的网络使用带有 Web 代理的防火墙,那么您可能需要为各种命令行应用程序配置代理信息才能工作。您可能需要咨询您的网络管理员以找出用于代理设置的计算机名称和端口。以下命令是常见的Git Bash示例,说明如何通过设置环境变量来配置代理:

    $ git config --global https.proxy <proxyname>.domain.com:<port>
    $ git config --global http.proxy <proxyname>.domain.com:<port>

如何设置 EDK II 树

注意:以下一些示例使用多工作区功能来配置 EDK II BaseTools。可以在以下位置找到有关多工作区功能的更多信息。

下载

从 Github 下载/检出 EDK II 源代码树

使用 Web 浏览器下载

  1. 下载 EDK II 项目
    1. 在浏览器中打开https://github.com/tianocore/edk2
    2. 单击克隆或下载按钮(右绿色)
    3. 点击下载ZIP
    4. 解压到 C:/
    5. 将目录“edk2-master”重命名为“edk2”
继续编译工具

在 Windows应用程序中使用Git

图形用户界面

  1. 克隆 EDK II 项目存储库
    1. 打开 Git 图形用户界面
    2. 使用Clone Exiting Repository和 Source location https://github.com/tianocore/edk2.git
    3. 选择目标目录 C:/edk2
    4. 也检查递归克隆子模块
    5. 单击克隆按钮
继续编译工具部分

git命令

如果您使用命令行版本,那么您可以使用以下 git 命令轻松地将 edk2 检出到 C:\edk2 目录: 主存储库:https : //github.com/tianocore/edk2

    $git 克隆 https://github.com/tianocore/edk2

继续编译工具,然后构建部分

编译工具

对于 Windows 上使用源 BaseTools 的 EDK II 项目开发人员:

例子:
  • Git Bash 内幕
     $ git clone https://github.com/tianocore/edk2

编译基础工具

例子:

  • 打开命令提示符和 CD C:\edk2:
     C:\edk2> 设置 PYTHON_HOME=C:\Python27
     C:\edk2> edksetup.bat 重建

建造

  • 设置Nasm开源汇编编译器
  • 设置ASL 编译器
  • 上面编译工具
  • 打开 Windows CMD 提示符:
  • 切换到edk2目录
  • 运行 edksetup.bat 脚本
      C:\Users\MySid> CD \edk2
      C:\edk2> edksetup

构建 MdeModulePkg

修改 Conf 文件

您将需要编辑 Conf\target.txt 文件。首先,将 ACTIVE_PLATFORM 更改为 MdeModulePkg:

C:\edk2> 记事本 Conf\target.txt

ACTIVE_PLATFORM 在 Conf\target.txt 中应如下所示:

ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc

为系统上安装的工具链修改 target.txt 中的 TOOL_CHAIN_TAG。有很多选项,因此请查看 tools_def.txt 以找到适合您系统的工具链。在 tools_def.txt 中搜索“支持的工具链”以查看 TOOL_CHAIN_TAG 的有效选项。

TOOL_CHAIN_TAG = VS2015x86

另请参阅:Windows-systems-ToolChain-Matrix了解如何更改工具链标签。

另外,请考虑是否要通过更改 target.txt 中的 TARGET_ARCH 值来构建不同的处理器体系结构。请考虑某些工具链仅支持构建某些处理器架构。

构建你好世界!(以及 MdeModulePkg 的其余部分)

现在您应该能够简单地运行构建命令来编译 MdeModulePkg。

C:\edk2> 构建

作为构建的实际结果,您应该拥有 HelloWorld UEFI 应用程序。如果您有一个与您构建的处理器架构相匹配的 UEFI 系统可用,那么该应用程序应该能够在 shell 下成功运行。

C:\edk2> dir /s Build\MdeModule\DEBUG_...\IA32\HelloWorld.efi

构建OVMF(可选)

构建环境设置好后,您可能对构建包含在主 edk2 源代码树中的OVMF平台感兴趣 。由于OVMF构建完整的系统固件映像,因此 UEFI 系统固件开发人员可能会对此感兴趣。

 

UDK2018 发布维基页面

UDK2018 是基于EDK II验证快照的UDK版本。之前的稳定分支是UDK2017

UDK2018 于 2018 年 3 月发布。请参阅UDK2018 发布页面https : //github.com/tianocore/edk2/releases/tag/vUDK2018
注意:此 wiki 页面包含有关此版本更改的更多详细信息。

如何构建UDK2018

请参阅:UDK2018 如何构建wiki 页面,了解有关如何为 Windows* 和 Linux 等开发系统构建的详细信息。

UDK2018 分支/标签

github 中有一个UDK2018 版本的标签 ( vUDK2018 ):https : //github.com/tianocore/edk2/tree/vUDK2018。使用该标签可以使用git clone带标签的命令下载官方发布的UDK2018源代码。
例子:> git clone https://github.com/tianocore/edk2.git vUDK2018

github 中还有一个 UDK2018 分支,如果开发人员想要跟踪正式发布后进行的关键错误修复,它会很有用:https : //github.com/tianocore/edk2/tree/UDK2018

UDK2018 特性/更新/变化

  • 请参阅UDK2018 主要特性了解行业范围的主要特性
  • 有关UEFI EDK II 核心包更改的更改,请参阅UDK2018 核心更新说明
  • 已知的问题:
    1. “edksetup.bat”不支持包含空格的目录名,所以请使用诸如“MyWorkspace”之类的目录名(而不是“My Workspace”)。
    2. 有关其他已知问题,请参阅包装说明。
  • 各种各样的
    1. EDK II 文档可从EDK-II-Documents General Documentation: EDKII User Manual 和 EDK II Module Writer's Guide 中获得。请参阅下文以了解与此 UDK2018 版本对应的 EDK II 规范

UDK2018 封装说明

以下链接是UDK2018正式版对EDK II包的详细更新

下载带有文档的 UDK2018 版本

源代码

注意:这些文件也可以从UDK2018 发布页面下载:https : //github.com/tianocore/edk2/releases/tag/vUDK2018
这些源代码下载来自UDK2018官方发布的标签vUDK2018
UDK2018 edk-vUDK2018 Workspace Source code (zip file)
UDK2018 edk-vUDK2018 Workspace Source code (tar.gz file)

文档

注意:此文件也可以从UDK2018 发布页面 下载:https : //github.com/tianocore/edk2/releases/tag/vUDK2018
此下载包含 UDK2018 的所有 .chm 和 .html 文档。每个包都包含有关定义(包括 PPI/PROTOCOL/GUID 和库类)和与每个包关联的库实例的详细信息。
UDK2018 文档(ZIP 文件)

单独的文档包

UDK2018 的 EDK II 规范

 

 

开始编写简单的应用程序

 
 

如何编写简单的 EDK II UEFI 应用程序

目录

1) 创建工作空间目录

例如mkdir edk2

2) 下载 Edk II 源码和构建工具

  1. 最新的 EDK II 源来自以下分步说明的说明
    1. 即示例>git clone https://github.com/tianocore/edk2.git
或者
  1. 下载最新的 .zip UDK2017下载版本(或最新的UDK版本)。

3)运行edksetup

在 Work Space 目录的命令行提示符下运行edksetup --nt32脚本

  1. Windows 命令提示符:C:\edk2> edksetup --nt32
  2. Linux 喜欢:bash$ 。edksetup.sh 基础工具

4) 编辑文件conf/target.txt

根据需要修改TARGET_ARCHTOOL_CHAIN_TAG

  1. TOOL_CHAIN_TAG 见:
    1. Windows Windows 系统工具链矩阵
    2. 使用 EDK II 和 Native GCC 的较新版本的 Linux
    3. 较旧的 Linux 发行版类 Unix 系统
    4. Mac OS X Xcode
  2. TARGET_ARCH - 可选也可以在 BUILD 命令行上使用“-a”
    1. IA32 和 X64:TARGET_ARCH = IA32 X64
    2. 只是 X64 : TARGET_ARCH = X64
    3. 在覆盖 target.txt 的 commnad 行上:BUILD -a X64

5)创建项目

  1. 创建一个新目录。可以是工作空间目录中任何位置的目录(例如 C:\edk2\ MyHelloWorld或 ~/src/edk2/ MyHelloWorld
  2. 在项目目录中创建一个 .c 文件(参见示例:MyHelloWorld.c
  3. 在项目目录中创建一个 .inf 文件(参见示例MyHelloWorld.inf

6) 构建您的 UEFI 应用程序

构建 X64 UEFI 应用程序

  1. 使用您的项目 .inf 文件更新现有平台 .DSC 文件。下面列出了一些示例。
    1. 编辑 DuetPkg/DuetPkgX64.dsc 并将您的新应用程序添加到[Components]部分和[BuildOptions]部分之前。(例如MyHelloWorld/MyHelloWorld.inf)
  2. 调用构建
    1. 在命令提示符> Build -a X64 -p DuetPkg/DuetPkgX64.dsc
  3. 最终输出 .efi 文件将位于WorkSpace /Build/DuetPkg/DEBUG_$( TOOL_CHAIN_TAG )/X64 目录中

构建 IA32 UEFI 应用程序

  1. 由于这是根据 target.txt 更新 Nt32Pkg/Nt32Pkg.dsc 文件的默认设置。
    1. 编辑 Nt32Pkg/Nt32Pkg.dsc 并将您的新应用程序添加到[Components]部分和[BuildOptions]部分之前。(例如MyHelloWorld/MyHelloWorld.inf)
  2. 调用构建
    1. 在命令提示符 >构建
  3. 最终输出 .efi 文件将在目录WorkSpace /Build/NT32/DEBUG_$( TOOL_CHAIN_TAG )/IA32 中
  4. 使用 Windows NT 32 仿真进行测试:命令提示符 >构建运行

四、环境变量配置

1、配置Path变量

系统变量Path中添加

2、新增PYTHON_HOME变量

添加PYTHON_HOME变量

五、开始编译

官网说明:https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems

以下步骤均在cmd中运行,总结如下:
所在目录为EDK II源码根目录


\edk2>set PYTHON_HOME=C:\Python

\edk2>edksetup.bat Rebuild

\edk2 edksetup.bat

\edk2>notepad Conf\target.txt

修改:TOOL_CHAIN_TAG        = VS2017

保存target.txt

\edk2>build

编译成功后,你应该会看到如下信息:

编译成功效果

六、运行模拟环境

\edk2>cd Build\EmulatorIA32\DEBUG_VS2017\IA32
\edk2\Build\EmulatorIA32\DEBUG_VS2017\IA32>WinHost.exe

生成文件

运行效果-1

运行效果-2

七、搭建完成

1人点赞

UDK2018 BaseTools 笔记

  1. 介绍
  2. 新功能和增强功能
  3. Bug修复
  4. 已知的问题
  5. 笔记
  6. 最知名的方法

介绍

这是处理 EDK II 内容的主要工具集。它包含配置模板和源文件。这些工具支持基于 Makefile 的 EDK II 构建,无需额外的包——编译器工具链、汇编器和可选的 ACPI 汇编器是构建 EDK II 项目所需的唯一额外工具。

源代码分为两种:

  1. 用 C (ANSI C) 编写的工具主要用于修改二进制数据结构的工具。
  2. 基于 Python (Python) 的工具主要用于解析或处理文本文件的工具。

新功能和增强功能

  1. 添加/GwCC_FLAGSVisual Studio 2013(VS2013) 和更高版本的工具链标签
  2. 增强报告不显示空白部分
  3. 更新 tools_def.template 以删除旧的 XCLANG 和 XCODE32
  4. MM使用构建工具注册模块类型
  5. 支持python脚本 PREBUILD/POSTBUILD
  6. 添加python脚本以运行makefile
  7. -pie在 GCC 工具链中添加缺少的链接选项
  8. 将 FFS 对齐扩展到 16M
  9. 报告由 EDK II Build 模块测量的构建时间
  10. 添加对带有二进制缓存的 BIOS 构建的支持
  11. PI 1.6 支持 FV 扩展头包含 FV 使用的大小
  12. 在 Mac 上解析 Xcode 生成的地图文件
  13. Guid.xref 包含来自 FDF 中的 FILE 语句的信息
  14. 在 BaseTools tools_def.template 中添加 Visual Studio 2017 (VS2017) 工具链
  15. GenFfs 支持从 SectionFile 获取对齐值
  16. 更新 Makefile 以支持 FFS 文件生成
  17. PcdValueCommon逻辑添加到 C 源代码中CommonLib
  18. 支持 DEC/DSC 中的结构 PCD 值分配
  19. 收集DynamicHiiPCD 值并将其分配给 VPD PCD 值
  20. 支持结构 PCD 值在不同 SKU 之间继承
  21. 报告结构 PCD 值和 SKU,DefaultStore信息
  22. 支持 PCD 灵活值格式
  23. 添加对 PCD 值的 DevicePath 支持
  24. 当只有单个 SKUID 时,不打印 PCD 的 SKUID 信息
  25. 启用MAX_CONCURRENT_THREAD_NUMBER = 0功能
  26. 在命令行中结构 Pcd
  27. StructurePcd 数组值支持灵活的格式
  28. GNUmakefile:HOST_ARCH检测移动到通用 makefile 中
  29. GNUmakefile:HOST_ARCH在每个工具 Makefile 中删除
  30. *B为来自命令行的字段添加标志
  31. 当添加更多的错误消息PcdValue是错误的
  32. 提高结构 PCD 值生成的构建性能
  33. DSC Components 部分支持灵活的 PCD
  34. 更新--pcd解析器以支持灵活的 pcd 格式
  35. 检测结构pcd头文件变化。
  36. 添加PackageDocumentTools到脚本文件夹

BUG修复

  1. 将“MODULE_UNI_FILE”文件复制到OUTPUT目录中
  2. 将“TianoCore”用户扩展复制到 As Built Inf
  3. 修复使用'|''||'在 DSC 文件的 Pcd 值中的错误
  4. 使用-m选项修复多次构建相同 INF 的错误
  5. 修复 FDF 文件解析!include 文件问题
  6. 修复错误以正确检查FDF文件中的Pcd类型
  7. 修复 DEC 文件中 section 标签之间使用 TabSpace 的问题
  8. *B 当构建选项中的 Pcd 值与 DEC 相同时不显示
  9. 修复报告中显示混合 Pcd 值的错误
  10. 修复一个错误以纠正 SourceFileList
  11. 修复'DSC DEFAULT'报告错误使用FDF值的bug
  12. 修复一个错误 Build 目录应该相对于 WORKSPACE
  13. 修复为库重新构建uni文件的错误
  14. 修复按构建规则族收集源文件的错误
  15. 使用GenC/GenMake选项修复单个模块构建的错误
  16. 更新 Makefile 以在绝对路径下工作
  17. 修复了多个 Sku 总是被禁用的问题
  18. 生成正确的 VPD PCD 值以存储默认设置
  19. 修复结构 pcd 归档 sku 继承覆盖的问题
  20. 更新 SkuId 检查器以确保它是有效的 UINT64 值
  21. 更新 Python Makefile 以包含新添加的 Python 文件
  22. 修复不同 FV 使用相同 FILE 语句 Guid 的错误
  23. 修复QuarkPlatformPkg构建失败的bug
  24. 修复 Visual Studio 2010 (VS2010) 上的编译错误
  25. 修复 SKU 继承导致的 Pcd 值覆盖问题
  26. 修复GenFds缺少覆盖命令选项更改的增量构建错误
  27. 增强二进制文件[Binaries] 部分使用相对路径
  28. 更新 SKUID 值以支持整数和十六进制数
  29. 添加DefaultStore节格式检查
  30. CommonLib 修复崩溃以写入最后一个字节
  31. HiiPcd如果它们链接到相同的变量,则组合该值
  32. 修复了 PCD 值初始化的构建失败
  33. 支持多个.h文件
  34. 更新Expression.py字符串比较和宏替换问题
  35. 更正生成压缩段过程
  36. 添加检查 INF 语句必须是 .inf 文件
  37. GenFv: 更新错误消息以描述 PE 图像对齐
  38. BuildOptions在 DSC 中覆盖 MAKE_FLAGS
  39. 转换 XIP 图像时更新GenFw以更正DebugEntry偏移
  40. GUID 格式 PCD 值分配在结构 PCD 字段中失败
  41. 对齐WIN_CERTIFICATE_UEFI_GUID 定义MdePkg一个
  42. 修复*M 报告中显示错误标志的错误
  43. 如果标志LABEL()无效则报告错误
  44. 修复了 Pcd 值覆盖问题
  45. 报告中的正确结构 Pcd 值
  46. 修复相对于工作空间搜索Fv.txt文件的bug
  47. 修复转换 iSCSI 节点时的错误
  48. 处理 8 字节数组时修复字节顺序
  49. 更新DNS_DEVICE_PATH/URI_DEVICE_PATH定义
  50. 修复一个--pcd用于ConditionalStatement计算的错误
  51. 修复解析OFFSET_OF得到错误的偏移量
  52. DatumType从 DEC 文件中获取 Pcd--pcd
  53. --hash --binary-destination 生成错误的二进制路径
  54. 修复VOID* DynamicDefaultPcd 使用灵活格式的错误

已知的问题

  1. 在外部文件中使用多个"!if"or"!endif"语句会导致构建中断。将破坏构建的示例:

在 DSC 部分之一中,使用以下 !include 语句,例如:

    [Components]
    !include externalFile.txt
    !endif
    !endif

在 externalFile.txt 中,内容是:

    !if True
    !if True
    TestPkg1/TestModule1/Test1.Inf
  1. 如果在命令行和 Conf\target.txt 文件中都没有指定构建目标信息,构建工具将立即退出构建。

  2. 在 FDF 条件指令语句中使用的 PCD 没有 SET 语句在 FDF 文件中定义此 PCD 将导致构建中断。一个例子如下:

在 DEC 文件中:

    [PcdsFixedAtBuild]
      gEfiPcdname.Pcdtoken|0x0|UINT32|0x11112222

在 DSC 文件中:

    [PcdsFixedAtBuild]
      gEfiPcdname.Pcdtoken|0x0

在 FDF 文件中:

    [FD.NT32]
    !if gEfiPcdname.Pcdtoken == 0x00000000
      XXXXXXXXXXX
    !endif

另一个例子是:

    [FD.Nt32]
      BaseAddress   = 0x0|gEfiNt32PkgTokenSpaceGuid.PcdWinNtFdBaseAddress
      !if gEfiNt32PkgTokenSpaceGuid.PcdWinNtFdBaseAddress
        xxxxx
      !endif
  1. 如果使用工具链DDK3790 和ARCH X64 构建,并且HII 资源由Resource Compiler (RC) 工具生成,则构建将中断。但是 BaseTools 项目在修订版 2656 中添加了此支持。解决方法是将 WINDDK_BIN32 添加到%PATH%.

  2. nmake 的目标路径名不能超过 256 个字符,长文件路径特性只能支持纯二进制构建,不生成 Makefile。

  3. 对于--pcd option,在 python 选项解析器之后没有引号字符,所以存在一些关于--pcd Pcd=Valueand 的错误--pcd Pcd="Value",例如:--pcd Pcd="3"对于 UINT8 类型的 PCD,当前工具仍然将此 PCD 的值设置为数字 3 而不是字符串 3。

  4. 对于灵活格式支持的结构体 pcd 字段值分配,由于工具不知道定义文件中定义的字段的数据类型,因此会导致一些构建错误。例如:该字段是UINT8类型,但用户将值设置为{1},这将导致构建中断。

  5. DSC[Components]部分、INF 和 FDF 文件不支持结构 pcd 字段值分配。

  6. 无法在 Visual Studio x64 命令提示符下编译 BaseTools C 源文件。

笔记

  1. DSC/FDF 文件中引用的宏现在需要包含"$()"以避免歧义。

  2. EFI_SPECIFICATION_VERSION并且PI_SPECIFICATION_VERSION不再是 autogen 代码中的公共宏定义。

  3. CLM 支持的特性增加了在一个工作空间下两个平台构建失败的机会。我们需要避免在一个工作空间下并发构建不同平台。

  4. BRG 的执行顺序预测功能需要名为 EOT 的新内部 Python 工具。它需要在 Python home 中安装 ANTRL v3.0.1 以获得 Python 运行时支持。该工具解析平台构建中涉及的所有源文件,甚至可能需要数小时才能完成解析并生成报告。

  5. [Capsule]不支持 FDF 文件部分中CAPSULE_FLAGS 的空白设置。如果没有CAPSULE_FLAGS设置,则 CAPSULE_FLAGS无需在[Capsule]节中指定。

  6. 除了一些预定义的情况外,EDK II INF 中不允许使用全局宏;请参阅 INF 规范 1.26 第 2.2.6 章中的详细信息。

  7. !if!ifdef,后的表达式!elseif不能为空。

  8. FDF 中的节头不能包含宏。

  9. 定义部分中的名称和值定义必须遵循 DSC 规范。

  10. DSC 文件中定义的 PCD 类型应与 DEC 文件中此 PCD 的可能类型相匹配。

  11. MACRO 使用范围请参考元数据文件规范。以下是一些一般信息。

   INF - [Defines] section or any statements contain <PATH> or [BuildOptions] section
   DEC - [Defines] section or any statements contain <PATH>
   DSC - [Defines] section or any statements contain <PATH> or [BuildOptions] or Conditional Directive statements
   FDF - Whole File
  1. VfrCompile 工具为 Oneof 和 Numeric 操作码添加了数据类型检查。对于Oneof和数字问题的有效的数据类型为UINT8 UINT16UINT32UINT64

最广为人知的方法

  1. 当构建工具更新时,in中的构建配置模板$(WORKSPACE)\BaseTools\Conf\*.template也可能会更新,需要与local合并$(WORKSPACE)\Conf\*.txt以避免一些构建错误。

  2. 为确保平台在没有任何先前构建影响的情况下干净重建,$(WORKSPACE)\Conf\.cache可以删除缓存的元数据信息目录 ie 。

  3. 如果由于访问错误导致构建失败$(WORKSPACE)\Conf\.cache\build.db,可以在同一工作空间下重新构建提示,无需任何并发构建过程。

  4. 当使用不同的 MACRO 设置在两次构建中启用具有相同模块 GUID 和驱动程序名称的不同驱动程序时,增量构建将无法正常工作。第二次构建需要干净的构建。

  5. EOT 工具依赖于 ANTRL 3.0.1 运行时库,较新的 ANTRL 版本(例如 3.1.2)与旧版本不兼容。所以需要从www.antlr.org下载ANTLR 3.0.1 ,安装python运行库到本地python home。

  6. 通知功能相关功能未集成到 BRG 输出纯文本报告文件中。当调用 EOT(来自 BRG)时,会在工作空间目录下生成 Report.html。此 HTML 报告文件显示每个模块下的通知功能的详细信息(如果可用)。

  7. Prebuild 和 Postbuild 条目必须是可以执行的工具。

UDK2018 CryptoPkg 笔记

新功能和变化

  1. OpenSSL 版本已更新为新的 1.1.0g(于 2017 年 11 月 2 日发布)。

  2. OpenSSL git 存储库作为一个子模块添加到 EDK II 项目中。请参阅 CryptoPkg/Library/OpensslLib/OpenSSL-HOWTO.txt 了解如何克隆/提取主 EDK II 存储库和openssl子模块。

  3. Cryptest应用除去从CryptoPkg,这是仅适用于单元测试。

包接口变化

  1. 以下 API 被添加到 BaseCryptLib.h

    1. 一种X509GetCommonName()用于从一个 X.509证书中检索主题通用名称 (CN) 字符串的新API 。

UDK2018 IntelFrameworkModulePkg 注释

新功能和变化

  1. 添加IOMMU支护在LegacyBiosDxe

  2. 更新FwVolDxe以获取从 PEI 为 PI 1.5 传播的 FV 身份验证状态。

  3. 更新FwVolDxe以支持FFS_ATTRIB_DATA_ALIGNMENT_2PI 1.5。

  4. 更新LegacyBiosDxeKeyboardDxe使用宏来enable/disable page 0

包接口变化

  1. 删除无用的性能“Perf中的”代码BdsDxeGenericBdsLib

BUG修复

  1. 修复滥用AllocateCopyPool导致堆内存溢出的问题。

  2. 更新KeyboardDxePs2KeyboardDxe ReadKeyStrokeEx()始终返回密钥状态。

  3. 修复Xcode 9 Beta将 32 位左移视为未定义;

UDK2018 IntelFrameworkPkg 注释

新功能和变化

  1. 添加宏 ACCESS_PAGE0_CODE 保证页面 0 访问
  2. 在 PeiHobLibFramework 中实现 BuildFv3Hob。

IntelFsp2Pkg

该软件包提供了创建 FSP 二进制文件的组件。

源代码库:https : //github.com/tianocore/edk2/tree/master/IntelFsp2Pkg

描述 IntelFsp2Pkg 的白皮书:https ://firmware.intel.com/sites/default/files/A_Tour_Beyond_BIOS_Creating_the_Intel_Firmware_Support_Package_with_the_EFI_Developer_Kit_II_%28FSP2.0%29.pdf

UDK2018 IntelFsp2WrapperPkg 注释

新功能和变化

  1. 为平台预先分配 FSP UPD 缓冲区提供灵活性。添加了 2 个新 PCD
    gIntelFsp2WrapperTokenSpaceGuid.PcdFspmUpdDataAddress
    gIntelFsp2WrapperTokenSpaceGuid.PcdFspsUpdDataAddress

UDK2018 IntelSiliconPkg 笔记

新功能和变化

  1. 为 PEI/DXE添加基于 Intel VTd 的IOMMU支持。它们可用于抵抗对固件的 DMA 攻击。添加 Platform VTd Policy 协议并PlatformVTdSampleDxe演示如何生成该协议。

    注:GetExceptionDeviceList接口和PlatformVTdSampleDxe应仅用于开发/调试的目的,绝不能用于生产的基础之上。

  2. 添加MicrocodeUpdate胶囊支持。

UDK2018 MdeModulePkg 注释

  1. 新功能和变化
  2. Bug修复
  3. 已知的问题

新功能和变化

  1. 培芯:

    1. 处理来自 SEC 的通知 PPI。
    2. 安装SEC HOB数据。
    3. 支持预内存页分配。
    4. 消耗新的 PCDPcdInitValueInTempStack以获取临时堆栈中的初始值。
  2. PeiCoreDxeCore:

    1. 支持FFS_ATTRIB_DATA_ALIGNMENT_2
    2. PEI-phaseFV 身份验证状态传播到 DXE。
    3. 支持EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE
  3. 核心:

    1. 增强“ ConvertPages: Incompatible memory types”。
    2. 删除 UEFI 应用程序的额外连接。
  4. PiSmmCore:在注册的 SMI 处理程序中安装EndOfS3ResumeS3SmmInitDone协议。

  5. PiSmmIpl:

    1. 处理CommSize OPTIONAL的情况SmmCommunicationCommunicate
    2. 删除 的NX页面属性SMRAM
  6. DxeIplPeim:将页表标记为只读。

  7. 更新DxeIplPeimSectionExtractionPei移除硬编码对齐调整。部分数据对齐应在构建生成中进行。

  8. 空指针检测:DxeIplPeimDxeCore已更新以支持该功能。

    1. 此功能用于检测对NULL指针的无效访问,如果检测到此类问题将触发页面错误异常。由于实施限制,此功能实际上会检测访问第 0 页 (000-FFF) 中的任何地址。此功能是通过启用BIT0BIT1的 PcdNullPointerDetectionPropertyMask的UEFI和SMM代码分开。
    2. 对于需要在第 0 页访问遗留内存的源遗留驱动程序ACCESS_PAGE0_CODE,如果需要启用此功能,则可以使用宏将这些语句括起来以避免不必要的页面错误异常而不会丢失其原始功能。
    3. 对于二进制传统驱动程序,遗留OptionROM和传统兼容的操作系统加载器,这将正常访问网页0 BIT7PcdNullPointerDetectionPropertyMask可以使用,作为最后的手段,到之后禁用此功能 EndOfDxe的事件。
    4. 默认情况下禁用此功能。
  9. Heap Guard: DxeIplPeim, DxeCorePiSmmCore更新以支持该功能。

    1. Heap Guard 用于检测堆内存溢出,如果检测到此类问题将触发页面错误异常。它由页后卫和游泳池后卫,这可以通过单独或同时被激活的BIT0 和BIT1PcdHeapGuardPropertyMask对UEFI内存,并通过BIT2BIT3SMM的记忆。
    2. 为了让 Heap Guard 开始工作,用户仍然需要启用一种或多种内存分配类型(如EfiBootServicesData),需要通过PcdHeapGuardPageType和/或进行检测PcdHeapGuardPoolType。这两个 PCD 控制 UEFI 和 SMM 内存。
    3. 对于池内存,BIT7ofPcdHeapGuardPropertyMask旨在详细说明从访问增长或下降方向检测缓冲区溢出。默认情况下它被清除(增长方向)。
    4. 由于内存消耗、性能和潜在的操作系统启动影响,不建议在生产 BIOS 中启用此功能。
    5. 默认情况下禁用此功能。
  10. Stack Guard: DxeIplPeim, DxeCore已更新以支持该功能。

    1. 该特性用于检测整个 UEFI 堆栈内存的溢出,包括 BSP 和所有 AP 的堆栈。如果检测到此类问题,将触发缺页异常。它可以通过 启用/禁用 PcdCpuStackGuard
    2. 默认情况下禁用此功能。
  11. 添加IOMMU支持。

    1. 添加 IOMMU PPI 和协议定义。
    2. 更新PciBusDxe以支持 IOMMU。安装IOMMU协议后,PciBus调用IOMMU为Map/Ummap中的PCI设备设置访问属性。
    3. 更新PciHostBridgeDxe以支持 IOMMU。当安装 IOMMU 协议时,PciHostBridge只需调用 IOMMU AllocateBuffer/FreeBuffer/Map/Unmap
    4. 更新SdBlockIoPei, EmmcBlockIoPei, UfsBlockIoPei, EhciPei, UhciPeiXhciPei支持 IOMMU。
  12. 添加EndOfS3ResumeGUID定义,S3 SMM初始化完成后,S3启动脚本执行前,GUID会在S3恢复阶段结束时作为SMM环境中的协议安装。

  13. 添加S3SmmInitDoneGUID 定义,GUID 在 PEI 中将作为 PPI 安装,在 SMM 环境中安装为协议。

  14. 添加SmmMemoryAttribute协议定义,该协议旨在PiSmmCore能够为了堆保护功能而更改内存页面属性。

  15. 添加LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY lockbox属性并更新LockBoxLib以支持它。

  16. 添加一个新的APIInitializeCpuExceptionHandlersExCpuExceptionHandlerLib,以支持初始化异常处理程序与需要额外的初始化数据,如栈溢出保护功能的堆叠交换机的额外功能。

  17. BootScriptExecutorDxe:删除保留的 NX 页面属性FfsBuffer

  18. 更新RuntimeDxePeiCrc32GuidedSectionExtractLib消费CalculateCrc32()的API BaseLib

  19. UefiBootManagerLib

    1. 支持DNS设备路径描述。
    2. 为 SD/eMMC 生成引导描述。
    3. 删除无用的性能代码。
  20. MemoryTest:更新GenericMemoryTestDxeNullMemoryTestDxe处理更可靠的内存类型。

  21. In SmbiosMeasurementDxe: 跳过测量 OEM 类型和平台代码,如果需要,可以自行测量。

  22. FirmwarePerformancePei:删除SEC性能数据获取代码SecCoreUefiCpuPkg增加了 SecPerformancePpiCallBack获得SEC的性能数据,并建立HOB传达了SEC的性能数据DXE阶段。

  23. PeiDxeDebugLibReportStatusCode: 格式字符串太长时部分打印。

  24. SerialDxe

    1. 进程超时始终如一SerialRead
    2. SerialSetAttributes.
  25. 重置系统

    1. 添加PlatformSpecificResetFilterPlatformSpecificResetHandlerPPI和协议定义。
    2. 添加PlatformSpecificResetNotificationPPI 定义。
    3. 更新ResetSystemRuntimeDxe来实现ResetNotificationResetFilterResetHandler协议。
    4. 添加ResetSystemPei到实施Reset2, ResetNotification, ResetFilterResetHandlerPPI。
    5. 添加ResetSystemLib实例,PeiResetSystemLib调用PEI服务表中的ResetSystem2()服务, DxeResetSystemLib调用ResetSystem()UEFI运行时服务表中的服务。
    6. 添加ResetUtility库类和 BASE 实例。提供服务以生成特定于 GUID 的重置、从特定于 GUID 的重置解析 GUID 以及ResetData为需要额外数据的任何类型的重置构建缓冲区的库类。
    7. 更新PeiCore为始终首先尝试使用Reset2PPI。
  26. PCD:

    1. 更新 PCD 驱动程序以支持优化的PcdDataBase.
    2. 启用固件以恢复默认设置,添加两个 PCDPcdSetNvStoreDefaultId和 PcdNvStoreDefaultValueBuffer.
    3. 删除未使用的PCD attribute PCD_TYPE_SKU_ENABLED.
  27. 可变 DXE/SMM 驱动程序:

    1. 弃用EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
    2. 更新GetNextVariableName以遵循 UEFI 2.7。
    3. 更新代码以在 NV 变量存储为 auth 格式时也支持正常格式的变量存储 HOB。
  28. 健康保险

    1. EFIVarstore/Buffer Varstore BIT现场支持

      1. 为 BitField 支持添加 GUID/标志定义。
      2. 更新SetupBrowserDxe, HiiDatabaseDxe, UefiHiiLibVarCheckHiiLib处理/检查存储在 EFI 的 BIT 字段中的问题Varstore/Bufffer Varstore
      3. 添加示例案例DriverSampleDxe以创建 BIT/UNION varstore 并添加示例问题以使用bit/union VarStore
    2. 更新HiiDatabaseDxe以将 vfr 文件中的默认设置替换为通过DynamicHiiPCD设置的设置。

    3. 更新DisplayEngineDxe以添加HiiPopupUEFI2.7 规范中定义的协议的实现

    4. 更新DriverSampleDxe以添加示例案例以使用HiiPopup协议。

  29. 网络:

    1. 更新网络堆栈驱动程序 ( DHCP, iSCSI, PXE) 以检查 AIP 协议的“网络媒体状态”类型,如果EFI_NOT_READY返回,则等待 NIC 恢复网络连接。
    2. HttpLib:HttpMappingToStatusCode()更新以处理HTTP_STATUS_308_PERMANENT_REDIRECTUEFI 规范中新定义的 HTTP 状态代码 。
    3. IP4:
      1. 更新Ip4Config.SetData()以清理某些配置数据。
      2. Ip4Ip4Config2如果默认IPv4 地址不可用且UseDefaultAddress设置为,驱动程序将更新以触发协议以检索默认地址TRUE
      3. 更新IP4堆栈以支持具有 31 位掩码 ( RFC3021)的点对点链接。
    4. NetLib: 新增库接口NetLibDetectMediaWaitTimeout(),支持AIP协议的媒体状态检测。
  30. 性能基础设施:更新 EDK II 性能基础设施以记录和转储性能条目作为 ACPI FPDT 表中的 FPDT 记录。更新后的性能基础架构可以支持在 UEFI Shell 和 OS 中转储性能数据。

    1. PeiPerformanceLib
      1. 更新PeiPerformanceLib以在 PEI 阶段将 Perf 条目转换为 FPDT 记录。
      2. DxeCorePerformanceLib通过 GUID 滚刀报告 PEI 阶段的 FPDT 记录。
    2. SmmCorePerformanceLib
      1. 更新SmmCorePerformanceLib以在 SMM 阶段将 Perf 条目转换为 FPDT 记录。
      2. 定义一个新的结构smm boot performance table来保存SMM阶段FPDT记录的内容和大小,并将smm boot performance table的地址上报到FirmwarePerformanceDataTableSmm.
    3. DxeCorePerformanceLib
      1. 更新DxeCorePerformanceLib以在 DXE 阶段将 Perf 条目转换为 FPDT 记录。
      2. 通过 GUID 滚刀收集 PEI 阶段的 FPDT 记录。
      3. 通过MM Communication协议收集SMM阶段的FPDT记录。
      4. 分配启动性能表保存所有的FPDT记录,并将启动性能表的地址上报到FirmwarePerformanceDataTableDxe.
    4. FirmwarePerformanceDataTablePei: 将 FPDT 记录添加到 S3 阶段的基本启动性能表中
    5. FirmwarePerformanceDataTableSmm:更新FirmwarePerformanceDataTableSmm以接收 .smm 报告的 smm 启动性能表地址SmmCorePerformanceLib
    6. FirmwarePerformanceDataTableDxe
      1. 更新FirmwarePerformanceDataTableDxe以接收由 DxeCorePerformanceLib.
      2. 更新FirmwarePerformanceDataTableDxe到 Hook EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT以安装 ACPI 表。
      3. 删除宏EXTENSION_RECORD_SIZE,因为可以通过扩展大小PcdExtFpdtBootRecordPadSize
      4. 删除 SMM 阶段收集引导记录的代码(代码已移至 DxeCorePerformanceLib)。
  31. 更新ReadKeyStrokeEx()Ps2KeyboardDxe, TerminalDxeConSplitterDxe始终返回键状态,即使没有按键。

  32. AtaAtapiPassThruDxe: 将 PHY 检测超时值从 10ms 放宽到 15ms。

  33. SdDxeEmmcDxe:为 SD/eMMC 设备生成磁盘信息协议。

  34. UfsPassThruDxe: 产生 EFI UFS 设备配置协议。

  35. 总线

    1. 在安装PciEnumerationCompletePciIo 协议之后安装协议,而不是在硬件枚举完成之后。更改是为了遵循 PI 规范,并且也有利于某些依赖PciIoPciEnumerationComplete回调句柄的实现。
    2. 为非根和根热插拔控制器保留总线编号。旧实现仅保留根热插拔控制器。
  36. 将翻译字段添加到PCI_ROOT_BRIDGE_APERTURE. 转换用于表示设备地址和主机地址之间的差异,如果它们在某些平台上不相同。

BUG修复

  1. PeiCore : 更新调试消息以正确打印 FV 句柄。

  2. 核心

    1. 避免在 CoreValidateHandleCoreDisconnectControllersUsingProtocolInterface()和 CoreOpenProtocol().
    2. 修复LoadImage失败路径上的双空闲页面。
    3. 修复 返回的接口CoreOpenProtocol
  3. PiSmmCore :

    1. 相互取消注册 LegacyBoot 和ExitBootServicesSMI 处理程序。
    2. 将 ForwardLink 设置为NULLinRemoveOldEntry()以修复潜在的链表断言。
    3. 修复由于已经释放的内存取消引用而导致的挂起。
  4. 修复AllocateCopyPoolinUiApp, BootMaintenanceManagerUiLib, DeviceManageruiLib, UefiHiiLib, FvSimpleFileSystemDxe和 的误用HiiDatabaseDxe

  5. DxePrintLibPrint2Protocol:修复精度位置计算中的错误。

  6. SmmLockBox: 返回更新后的长度EFI_BUFFER_TOO_SMALL

  7. SmmLockBoxDxeLibSmmCommRegion通过gEdkiiPiSmmCommunicationRegionTableGuid系统配置表获取SMM通信缓冲区。

  8. (SMM) S3SaveState:在功能正确的顺序提取参数EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODEEFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE

  9. PiSmmCoreMemoryAllocationLib:修复链接 FreePool()时的断言问题。PiSmmCorePeiDxeDebugLibReportStatusCode

  10. UefiBootManagerLib

    1. 删除不必要的断言BmCharToUnit以避免系统挂起。
    2. 当“ BootOptionSupport”变量不存在时删除断言。
    3. 删除多余的TimerLib依赖。
  11. DxeCapsuleLibFmp

    1. 使用 FMP 验证嵌套胶囊。当前使用 ESRT 表的逻辑不起作用,因为在准备启动事件中发布 ESRT 表之前处理胶囊。
    2. 为 UX 胶囊添加更多检查。
  12. CapsulePei: 对内存资源条目进行排序和合并,以处理BOOT_ON_FLASH_UPDATE引导模式和正常引导模式之间报告内存资源 HOB 不同的情况。

  13. FrameBufferBltLib

    1. 修复未对齐内存的复制。
    2. 修复了PixelsPerScanLine在计算线宽时使用导致显示损坏的错误。
  14. SerialDxe

    1. 修复无法更改串行属性。
    2. SetAttributes不支持时不要失败重置。
  15. 可变 DXE/SMM 驱动程序:

    1. 删除并锁定操作系统创建的 MOR 变量。
    2. 在没有 SMM 的情况下删除并锁定 MOR。
  16. 健康保险

    1. SetupBrowserDxe:更新 APIIsResetRequired以缓存由 UI 配置更改触发的所有重置信号。
    2. DisplayEngineDxe:修复角落用例暴露的不正确显示问题。用例:在一个页面中,当刷新某些问题时,可能会在突出显示菜单和屏幕顶部菜单之间动态插入一些新菜单。如果新添加的菜单导致高亮菜单和屏幕顶部菜单无法在一页中显示,则会出现错误显示。
    3. UefiHiiLib:修复了错误检查字符串操作码的字符串长度的错误。
    4. BootManagerUiLib:退出UiApp前检查重置要求,如果需要重置,平台将被重置。
    5. BootMaintenanceManagerUiLib:退出UiApp前检查重置要求,如果需要重置,平台将被重置。
  17. 网络:

    1. 修复 IP4 驱动程序中TxToken的错误,如果传输中发生错误,则该错误会被错误删除。
    2. 修复了 PXE 驱动程序中用户选择的选项在 DHCP 选项 43 的 PXE BootMenu 中被忽略的错误。
    3. 修复 IP4 驱动程序中的错误,Ip4IpSecProcessPacket()即使尚未安装 IpSec 协议,该驱动程序仍会始终调用以定位 IpSec 协议。
    4. 修复了在修剪操作之前未用 0 选中的DxeNetLib NetbufTrim()函数中的错误NetBuf TotalSize
  18. TerminalDxe:修复和的PCANSI映射。TRIANGLEARROW

  19. AtaAtapiPassThru: 禁用 BM DMA 后取消映射 DMA 缓冲区。

  20. ScsiBusDxe:不应在不存在的 LUN 上生成 EFI SCSI I/O 协议。

  21. ScsiDiskDxe:EFI_NO_MEDIA应该返回而不是EFI_MEDIA_CHANGED在从设备中移除媒体时返回。

  22. EmmcDxe:修复了可能会删除额外数据的错误EFI_ERASE_BLOCK_PROTOCOL.EraseBlocks()

  23. UfsPassThruDxeUfsBlockIoPei: 将 的 ' DATA SEGMENT LENGTH' 字段设置UPIU为要写入的描述符字节数。

  24. 优盘

    1. EhciDxe: 当同步中断传输完成时,调用 EhcFreeUrb 将映射的 DMA 缓冲区的内容复制到实际缓冲区中。

    2. XhciPeiXhciDxe:当 BABBLE 错误发生时恢复停止的端点。

    3. XhciDxe

      1. 修复中断传输中的数据丢失问题。数据丢失不会影响 USB 键盘/鼠标功能,但可能会导致 BLE 连接随机故障。
      2. 修复异步中断传输的 DMA 缓冲区映射和取消映射不一致。
    4. UsbMassStorageDxe:修复设备兼容性问题,以便支持更多 USB 软盘和 USB 密钥。

  25. NonDiscoverablePciDeviceDxe:修复PciIoPciRead界面中的内存覆盖错误。

  26. NvmExpressDxe

    1. 当阻塞 PassThru 请求超时时,通过重置 NVMe 控制器来中止请求。
    2. 系统重置时通知 NVMe 控制器。
    3. 修复NvmExpressPassThru().
    4. 修复未为 NVMe 写入命令映射的数据缓冲区。
  27. SdMmcPciHcDxe: 调用SdMmcFreeTrb()完成一个同步操作。

  28. PciBus : 修复EfiBusSpecificDriverOverride包含 option rom 的设备不生成协议的问题。

  29. PartitionDxe:修复ProbeMediaStatusEx()将堆栈中缓冲区的地址而不是 NULL 指针传递给 的 ReadDisk()接口EFI_DISK_IO_PROTOCOL

已知的问题

  1. 当前SmiHandlerProfile实现在SmmReadyToLock. 所以之后注册的 SMI 处理程序的配置文件SmmReadyToLock将不会被记录。

  2. 健康保险

    1. EFI_IFR_IMAGE, EFI_IFR_ANIMATION,EFI_IFR_VARSTORE_DEVICE不支持操作码。
    2. Suppressif/DisableIf/GrayoutIf不支持单个语句的嵌套条件。
  3. MNP 驱动程序更新为异步回收来自 SNP 的 TX 缓冲区。UNDI/SNP 实现必须按照 UEFI 2.6 附录 E.4.16 在 UNDI GetStatus 命令中返回回收的传输缓冲区地址才能使其工作,否则错误的回收缓冲区地址将导致 DEBUG 版本 MNP 驱动程序断言。

UDK2018 MdePkg 笔记

  1. 新功能和变化
  2. Bug修复
  3. 已知的问题

新功能和变化

  1. 添加统一可扩展固件 (UEFI) 规范 2.7 定义的协议/PPI/GUID 及其相关数据结构定义。

    1. 协议:
      EFI_HII_POPUP_PROTOCOL
      EFI_HTTP_BOOT_CALLBACK_PROTOCOL
      EFI_NVDIMM_LABEL_PROTOCOL
      EFI_PARTITION_INFO_PROTOCOL
      EFI_RESET_NOTIFICATION_PROTOCOL
      EFI_UFS_DEVICE_CONFIG_GUID

    2. GUID:
      EFI_BTT_ABSTRACTION_GUID
      EFI_ADAPTER_INFO_MEDIA_TYPE_GUID
      EFI_KMS_FORMAT_GENERIC_DYNAMIC_GUID

    3. 杂元素:
      a)增加DNS_DEVICE_PATH设备路径
      b)中添加定义EFI_FIRMWARE_ERROR_TYPE_SOC_TYPE1 / _TYPE2
      c)中更新的struct EFI_FIRMWARE_ERROR_DATA
      d)更新结构EFI_FTP4_COMMAND_TOKEN
      E)添加定义HTTP_STATUS_308_PERMANENT_REDIRECT
      F)正确定义HTTP_STATUS_300_MULTIPLE_CHOICES
      克)弃用属性EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
      1H)更新EFI_SERIAL_IO_PROTOCOL.SetAttributes()的返回状态
      i) 添加注释以解决 Pkcs7Verify 协议中的安全问题
      j) 更正 EFI_RESET_NOTIFICATION_PROTOCOL.UnregisterResetNotify

  2. 添加平台初始化(PI)规范 1.5/1.6 定义的协议/PPI/GUID 及其相关数据结构定义。

    1. 协议:
      EFI_DXE_MM_READY_TO_LOCK_PROTOCOL
      EFI_MM_ACCESS_PROTOCOL
      EFI_MM_BASE_PROTOCOL
      EFI_MM_COMMUNICATION_PROTOCOL
      EFI_MM_CONFIGURATION_PROTOCOL
      EFI_MM_CONTROL_PROTOCOL
      EFI_MM_CPU_PROTOCOL
      EFI_MM_CPU_IO_PROTOCOL
      EFI_MM_END_OF_DXE_PROTOCOL
      EFI_MM_GPI_DISPATCH_PROTOCOL
      EFI_MM_IO_TRAP_DISPATCH_PROTOCOL
      EFI_MM_PCI_ROOT_BRIDGE_IO_PROTOCOL
      EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL
      EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL
      EFI_MM_READY_TO_LOCK_PROTOCOL
      EFI_MM_RSC_HANDLER_PROTOCOL
      EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL
      EFI_MM_STATUS_CODE_PROTOCOL
      EFI_MM_SW_DISPATCH_PROTOCOL
      EFI_MM_SX_DISPATCH_PROTOCOL
      EFI_MM_USB_DISPATCH_PROTOCOL
      EFI_LEGACY_SPI_CONTROLLER_GUID
      EFI_LEGACY_SPI_FLASH_PROTOCOL
      EFI_LEGACY_SPI_SMM_CONTROLLER_PROTOCOL
      EFI_LEGACY_SPI_SMM_FLASH_PROTOCOL
      EFI_SPI_CONFIGURATION_GUID
      EFI_SPI_HOST_GUID
      EFI_SPI_IO_PROTOCOL
      EFI_SPI_NOR_FLASH_PROTOCOL
      EFI_SPI_SMM_CONFIGURATION_PROTOCOL
      EFI_SPI_SMM_HC_PROTOCOL
      EFI_SPI_SMM_NOR_FLASH_PROTOCOL

    2. PPI:
      EFI_SEC_HOB_DATA_PPI

    3. GUID:
      EFI_DISK_INFO_SD_MMC_INTERFACE_GUID

    4. 杂元素:
      一)正确EfiGcdMemoryTypePersistent名称
      b)中添加FFS_ATTRIB_DATA_ALIGNMENT_2
      c)中添加EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE
      d)添加EFI_HOB_FIRMWARE_VOLUME3
      E)添加EFI_MM_SYSTEM_TABLE
      F)添加EFI_PEI_FREE_PAGES
      克)添加EFI_SW_DXE_BS_PC_ATTEMPT_BOOT_ORDER_EVENT
      1H)弃用SMM通信ACPI表
      I)更新描述用于通知PPI从SEC
      j)的更正 EFI_PEI_RESET2_SYSTEM 的注释

  3. 添加/升级​​行业标准定义。

    1. 添加 ACPI6.2 表
    2. 更新 ACPI6.0/ACPI6.1 表
      a) 添加缺失的 PCCT 子空间类型 1 和 2 定义
    3. 添加 EFI_ACPI_DMAR_FLAGS_DMA_CTRL_PLATFORM_OPT_IN_FLAG
    4. 添加 ACPI IO 重映射表 (IORT) 定义
    5. 添加特定于 PCI 供应商的功能标头
    6. 正确的 PCI_REG_PCIE_SLOT_CONTROL 定义
    7. 添加新的 TPM 位以取消当前正在执行的命令
    8. 添加NVME关机通知相关宏
  4. 添加新的库类。

    1. PciSegmentInfoLib
    2. S3PciSegmentLib
  5. 在现有库类中添加新的库 API。

    1. 在 BaseLib 中添加 IsNodeInList()、CalculateCrc32()、AsmWriteTr()。
    2. 在 HobLib 中添加 BuildFv3Hob()
    3. 在 PeiServicesLib 中添加 PeiServicesFreePages() 和 PeiServicesResetSystem2()
    4. 在 DevicePathLib 中添加 DevPathFromTextDns() 和 DevPathToTextDns()
  6. 添加新的库实例。

    1. BasePciSegmentInfoLibNull
    2. BasePciSegmentLibSegmentInfo
    3. DxeRuntimePciSegmentLibSegmentInfo
    4. BaseS3PciSegmentLib
    5. 基本库内在服务
  7. 更新基础定义

    1. 在 BaseLib.h 中添加 struct IA32_TASK_STATE_SEGMENT 和 IA32_TSS_DESCRIPTOR
    2. 在 BaseLib.h 中添加两个宏 IA32_GDT_TYPE_TSS 和 IA32_GDT_ALIGNMENT
    3. 更正和澄清 Base.h 中 VA_LIST 的文档
  8. 禁用 VS2017 的 C4701 和 C4703 警告

BUG修复

  1. 更新 UefiDevicePathLib

    1. 修复 DevicePathFromText 中 iSCSI.Lun 的字节顺序。
    2. 修复转换 iSCSI 节点时应使用默认 TCP(0) 的错误。
  2. 在 UefiRuntimeLib 中支持更多模块类型。

  3. 更新 BaseLib

    1. 修复 SafeString 中潜在的越界内存访问
    2. 避免阅读超出字符串边界的内容
    3. 更新内部 LinkedList 验证。
  4. 更新 BasePrintLib

    1. 修复可能的负值左移
  5. 在IndustryStandard\PciExpress21.h中添加宏PCI_ECAM_ADDRESS

  6. 修复 Xcode 9 Beta 将 32 位左移视为 BaseUefiDecompressLib 中未定义的问题

  7. 修复 DxeHstiLib 中的内存泄漏问题

  8. 在 Base.h 中为 MSFT 工具链声明 _ReturnAddress()

已知的问题

  1. EFI_SIZE_TO_PAGES() 宏要求输入参数为 UINTN 数据类型。

  2. SecPeiDxeTimerLibCpu 库实例可由 DXE_RUNTIME_DRIVER 和 DXE_SMM_DRIVER 类型的驱动程序在初始化时使用,没有任何问题。但是,这些驱动程序在运行时服务和 SMI 处理程序的实现中需要小心。

  3. BaseExtractGuidedSectionLib 库实例可由 DXE_RUNTIME_DRIVER 和 DXE_SMM_DRIVER 类型的驱动程序在初始化时使用,没有任何问题。

UDK2018 NetworkPkg 笔记

  1. 新功能和变化
  2. 包接口更改
  3. UEFI/PI 规范合规性
  4. 已知的问题

新功能和变化

  1. 更新网络堆栈驱动程序(DHCP6, DNS, iSCSI, PXE HTTPBoot)检查“ Network Media State”类型的AIP协议,如果EFI_NOT_READY返回则等待网卡恢复网络连接。

  2. HTTP 启动更新

    1. 显示更多 HTTP 启动错误消息,可以帮助用户识别问题。例如,如果收到 HTTP 重定向响应,Redirection将显示HTTP 3xx状态代码以及 HTTP 启动映像的新 URI 地址。
    2. 添加EFI_HTTP_BOOT_CALLBACK_PROTOCOL支持。
    3. 将 DNS 设备路径节点添加到 HTTP 启动选项的文件路径。
    4. IPv6 Support from UNDI通过 IPv6 启动 HTTP Boot 之前,会检查“ ”类型的 AIP 协议。
    5. 修复了 HTTP 启动配置表单中无效的 URI 地址可能会损坏设置屏幕的错误。
  3. IP6 更新

    1. 修复了如果更改 IPv6 策略,IP6 PXE 引导选项可能会消失的错误。
    2. 更新Ip6Config.SetData()以清理某些配置数据。
    3. 修复Ip6IpSecProcessPacket()即使未安装 IpSec 协议也始终调用定位 IpSec 协议的错误。
  4. HTTP 更新

    1. 添加 HTTP PATCH 方法支持。
    2. 修复消息正文中重复数据返回给调用者的错误。
  5. iSCSI 更新

    1. iSCSIISID:#根据http://uefi.org/confignamespace 中的 x-UEFI 关键字定义,允许将 " " 关键字配置为长度为 6(仅最后 3 个字节)或 12(完整 ISID)的值 。
    2. 修复 iSCSI 关键字“ iSCSIInitiatorIpAddress:#”、“ iSCSIInitiatorNetmask:#”、“ iSCSIInitiatorGateway:#”和“ iSCSITargetIpAddress:#”的最大长度不正确的问题。
    3. 删除/返回的 " ISCSIMacAddr" 关键字中多余的 ' ' 字符。
    4. 修复了如果 iSCSI 尝试未与当前 NIC 关联时 DHCP 启动不正确的错误。
    5. 更新 iSCSI 配置表单以显示从 DHCP 服务检索的启动器配置。
    6. IPv6 Support from UNDI通过 IPv6 启动 iSCSI 引导之前,会检查“ ”类型的 AIP 协议。
    7. 修复 iSCSI 配置表单中未删除的先前显示的尝试页面中的 TargetIp 地址将保存到新创建的尝试中的错误。
    8. 当目标信息首先设置为从 DHCP 检索然后静态配置时,修复 iSCSI 连接失败。
    9. 修复了从 DHCP 检索目标信息并表示为 URI 格式时 iSCSI 连接失败的问题。
  6. DNS 更新

    1. 修复RetryCount/RetryInterval根据 UEFI 规范使用不正确调用方配置的错误。
  7. DHCP6 更新

    1. 在开始 DHCP 进程之前检查媒体存在状态。
  8. PXE 更新

    1. 修复了如果在PXE.Dhcp()界面中没有收到有效的 PXE 报价,则使用不正确的返回状态代码的错误。
    2. 修复一个错误,如果输入参数是PXE.SetStationIp(),则StationIp/SubnetMask不应修改地址。NewStationIP/NewSubnetMaskNULL
    3. 如果 PXE 无法从 Smbios 读取系统 GUID,则添加警告调试消息。

包接口变化

  1. 删除ping6ifconfig6外壳应用程序。
    Edk IIping6/ifconfig6NetworkPkg和 中重复了实现ShellPkg。这两个版本的用法和参数格式完全一样。这两个命令已经加入到UEFI Shell规范中,所以ShellPkg\Library\UefiShellNetwork2CommandsLib\ 以后会主动维护下 NetworkPkg副本,删除副本。

UEFI PI 规范合规性

  1. 添加EFI_HTTP_BOOT_CALLBACK_PROTOCOLUEFI 2.7 A 中第 24.7.6 节中所述的支持。HTTP 引导驱动程序已更新为支持 EFI HTTP 引导Callback 协议。当 HTTP Boot 驱动程序即将传输或已接收数据包时,将调用新协议。如果平台不提供,将安装新协议的默认实现,以百分比格式显示引导文件下载进度。

  2. UEFI 2.7 A 添加了澄清以EFI_IP6_CONFIG_PROTOCOL.SetData()清除具有零值 DataSize 参数的某些数据类型。IP6 驱动程序已更新以支持此功能。

  3. IPV6 Support from UNDI根据IPV6 Support from UNDIUEFI 2.7 A 中的第 11.12.4 节“ ”,在启动 IPv6 iSCSI/HTTP Boot 之前检查“ ”类型。

已知的问题

  1. 启用 IPsec 的 iSCSI 远程操作系统安装/启动。在当前的实现中,iSCSI 驱动程序能够在启用 IPsec 的情况下访问 pre-OS 环境中的存储服务器;而 iSCSI 远程操作系统安装/启动无法与 IPsec 一起使用,因为 IPsec 所需的参数不会传送到操作系统。将此类参数移交给操作系统的一种可能方式是使用 GUIDed 设备路径。

  2. 不支持 iSCSI NOP-Out 包。在当前实施中,不支持 iSCSI NOP-Out 功能。收到 NOP-In 并将“ Target Transfer Tag”设置为有效值而不是默认值时0xFFFFFFFF,连接可能会中断。用户需要关闭 iSCSI 目标端的 NOP-In 功能以避免此故障。

  3. 启用 IpSec IKEv2 时出现 iSCSI 连接问题。由于 UEFI 驱动程序模型限制,当 iSCSI 驱动程序尝试初始化与 iSCSI 目标的连接时,IpSec 驱动程序可能尚未启动。如果将 IpSec IKEv2 配置为使用,这将使 iSCSI 连接失败。用户可以在启用 IpSec 之前先建立 iSCSI 连接以解决此问题。

  4. 不支持在系统重置后立即通过 Wi-Fi 网络启动 PXE/HTTP 启动。Wi-Fi 设备需要额外的时间连接到 AP,在自动加载启动选项之前无法完成。用户可以在连接 Wi-Fi 网络后进入 Boot Manager 菜单选择并启动 PXE/HTTP Boot。

  5. Wi-Fi 网络上的 iSCSI 连接问题。由于 UEFI 驱动程序模型限制,当 iSCSI 驱动程序尝试初始化与 iSCSI 目标的连接时,Wi-Fi 设备无法连接到 AP。这将使 iSCSI 连接在 Wi-Fi 网络上失败。用户可以在连接 Wi-Fi 网络后从 UEFI shell 加载 iSCSI 驱动程序以解决此问题。

UDK2018 PcAtChipsetPkg 注释

新功能和变化

  1. 添加PeiAcpiTimerLib和更改DxeAcpiTimerLibPeiAcpiTimerLib在 HOB 中缓存性能计数器频率。 DxeAcpiTimerLib使用缓存的频率或在HOB中找不到它时重新计算频率。

BUG修复

  1. 修复了 IsaAcpiDxe 中可能导致键盘故障的错误 "reconnect -r"

包接口变化

  1. 在 PcAtChipsetPkg.dec 文件中添加以下 PCD。
      PcdInitialValueRtcRegisterA
      PcdInitialValueRtcRegisterB
      PcdInitialValueRtcRegisterD

UDK2018 SecurityPkg 注释

  1. 新功能和变化
  2. 包接口更改
  3. Bug修复

新功能和变化

  1. 经过身份验证的变量和安全启动

    1. 更新SecureBootConfigDxe以 2 层格式呈现 DBX 内容
    2. 将可信证书策略从整个签名者的证书堆栈更改为顶级颁发者证书,tbscertificate + SignerCert CN以实现更好的管理兼容性。散列用于减少存储开销。
  2. TCG

    1. 执行 TPM2.0 有序关闭以与平台重置合并。
    2. 定义新的 Pre-Hashed FV PPI 以避免在测量过程中重复哈希计算。
    3. 启用 TPM2.0 中断支持。2个pcds暴露报告可重配置和不可重配置的TPM中断资源
    4. 如果 TPM2.0 命令执行超时,支持命令取消
    5. OpalPasswordPei 添加以修复由 IOMMU 功能导致的 S3 路径中的 DMA 操作中止问题。
    6. 在 TPM1.2、TPM2.0 命令库中应用更多检查以修复内存损坏漏洞
  3. 杂项

    1. 删除RngTest应用程序。
    2. VerifySignaturePkcs7Verify协议中实现接口。

包接口变化

  1. 不再支持基于计数器的身份验证变量。带有属性的 SetVariable EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS将返回EFI_INVALID_PARAMETER. 当用户实际存在被断言时,仍然允许删除现有的基于计数器的身份验证变量。

  2. PcdTpm2CurrentIrqNumPcdTpm2PossibleIrqNumBuf引入平台上报TPM中断资源。PcdTpm2CurrentIrqNum由 报告,_CRSPcdTpm2PossibleIrqNumBuf 由 报告_PRS

  3. TrEE删除所有库和驱动程序。平台应使用Tcg2如下所述的库和驱动程序。

   包含/Guid/TrEEConfigHii.h < - 包含/Guid/Tcg2ConfigHii.h
   Include/Guid/TrEEPhysicalPresenceData.h < - Include/Guid/Tcg2PhysicalPresenceData.h
   Include/Library/TrEEPhysicalPresenceLib.h < - Include/Library/Tcg2PhysicalPresenceLib.h
   Include/Library/TrEEPpVendorLib.h < - Include/Library/Tcg2PpVendorLib.h
   库/TrEEPpVendorLibNull < - 库/Tcg2PpVendorLibNull
   库/DxeTrEEPhysicalPresenceLib < - 库/DxeTcg2PhysicalPresenceLib
   库/Tpm2DeviceLibTrEE < - 库/Tpm2DeviceLibTcg2
   Tcg/TrEEConfig < - Tcg/Tcg2Config
   Tcg/TrEEPei < - Tcg/Tcg2Pei
   Tcg/TrEEDxe < - Tcg/Tcg2Dxe
   Tcg/TrEESmm < - Tcg/Tcg2Smm

BUG修复

  1. 返回NOT_IMPLEMENTED固件中不支持的非供应商特定 PP。

  2. 拒绝非法PCR银行分配实体存在请求

  3. 修复HashInterfaceHob溢出问题

UDK2018 ShellPkg 注释

  1. 新功能和变化
  2. Bug修复
  3. 已知的问题

新功能和变化

  1. 已进行以下更改以提高输出可读性:
    1. 以更亮的蓝色/绿色显示所有输出。
    2. 更改“驱动程序”以在非 SFO 模式下显示图像名称而不是图像路径。
    3. 更改“ dmpstore ”以显示已知变量供应商 GUID 的名称。
    4. 改变“ dh ”:
      1. 在一行中显示所有协议名称。
      2. 以亮色而非蓝色显示关键信息。
      3. -v提供“ ”时显示协议实例指针值。
      4. 支持最新 UEFI/PI 规范中定义的协议。
      5. 显示以下协议的更多信息:
              ImageDevicePath
              DevicePath
              LoadedImage
              BusSpecificDriverOverride
              BlockIo
              DebugSupport
              GraphicsOutput
              PciIo
              UsbIo
              PartitionInfo
  1. 将“dp”和“tftp”从“NULL”类库转换为动态命令。

  2. 删除不必要的TimerLib从依赖ShellPkg.dsc

  3. 将“ edit ”和“ hexedit ”更改为通过SimpleTextInEx接口读取输入。

  4. 更改“ mm ”以移除不必要的 IO 地址限制 ( <= 0xFFFF)。

BUG修复

  1. 修复“ dh ”以显示正确的驱动程序型号信息。

  2. 修复“ ls ”以本地时间显示文件时间。

  3. 修复“映射”以在 CDROM 介质状态更改时显示正确的块 IO 信息。

  4. 修复“ dblk ”以在调用BlockIo接口时使用对齐的缓冲区。

  5. 修复“ mkdir ”以支持创建嵌套目录。

  6. 修复“ map -r ”后无法更改当前目录的错误。

  7. 修复“ ifconfig ”以显示正确的媒体状态。

  8. 修复控制台最大列大于 200 时的“编辑”挂起问题。

  9. 修复存储介质已满时“ tftp ”挂起的问题。

  10. 修复“ hexedit ”以便能够访问任何范围的 MMIO 空间。

  11. 修复运行命令前按Ctrl+C会意外终止命令的问题。

  12. 修复“ ping ”以不丢失第一个数据包。

已知的问题

  1. “ rm ”可以通过其他地图名称删除当前工作目录。

  2. “ devcfg ”不重叠引导管理器功能。

UDK2018 SourceLevelDebugPkg 注释

新功能和变化

  1. DebugCommunicationLibUsb3:使用 EdkiiIommu 接口获取 DMA 缓冲区。

包接口变化

  1. 添加 PCD PcdTransferProtocolRevision。

BUG修复

新功能和变化

包接口变化


      FIRMWARE_VARIABLE_MTRR_NUMBER
      MTRR_LIB_IA32_MTRR_CAP
      MTRR_LIB_IA32_MTRR_CAP_VCNT_MASK
      MTRR_LIB_IA32_MTRR_FIX64K_00000
      MTRR_LIB_IA32_MTRR_FIX16K_80000
      MTRR_LIB_IA32_MTRR_FIX16K_A0000
      MTRR_LIB_IA32_MTRR_FIX4K_C0000
      MTRR_LIB_IA32_MTRR_FIX4K_C8000
      MTRR_LIB_IA32_MTRR_FIX4K_D0000
      MTRR_LIB_IA32_MTRR_FIX4K_D8000
      MTRR_LIB_IA32_MTRR_FIX4K_E0000
      MTRR_LIB_IA32_MTRR_FIX4K_E8000
      MTRR_LIB_IA32_MTRR_FIX4K_F0000
      MTRR_LIB_IA32_MTRR_FIX4K_F8000
      MTRR_LIB_IA32_VARIABLE_MTRR_BASE
      MTRR_LIB_IA32_VARIABLE_MTRR_END
      MTRR_LIB_IA32_MTRR_DEF_TYPE
      MTRR_LIB_MSR_VALID_MASK
      MTRR_LIB_CACHE_VALID_ADDRESS
      MTRR_LIB_CACHE_MTRR_ENABLED
      MTRR_LIB_CACHE_FIXED_MTRR_ENABLED

BUG修复

  1. SmmDebugAgentLib:退出 SMM 环境时恢复 APIC 计时器。

    UDK2018 UefiCpuPkg 笔记

  2. 新功能和变化
  3. 包接口更改
  4. Bug修复
  5. BaseXApicLib 和 BaseXApicX2ApicLib:支持 AMD。

  6. CpuCommonFeaturesLib:

    1. 启用 PPIN(受保护处理器库存编号)功能。
    2. 删除 SENTER 功能,因为它已合并到 SMX 功能。
    3. 启用 LMCE(本地机器检查异常)功能。
    4. 启用 PROC_TRACE(处理器跟踪)功能。
  7. PiSmmCommunicationSmm:弃用 SMM 通信 ACPI 表。

  8. CpuExceptionHandlerLib:当启用堆栈保护时,为异常处理程序使用单独的堆栈。

  9. PiSmmCpuDxeSmm:

    1. 在 S3 恢复路径中组合 2 个独立的 INIT-SIPI-SIPI 以提高 S3 启动性能。
    2. 产生 EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL。它由 SMM 堆 gurad 功能使用。
    3. 在 SMM 环境中启用 NULL 指针检测。
  10. S3Resume2Pei:

    1. 在 S3 恢复路径结束时发出信号 EdkiiEndOfS3Resume 事件。
    2. 在 S3 SMM 环境初始化之后和启动脚本执行之前发出 EdkiiS3SmmInitDone 事件信号。
  11. 删除 Include/Library/MtrrLib.h 中废弃的宏:
  12. MtrrLib:添加 API MtrrSetMemoryAttributesInMtrrSettings()。

  13. 为 AMD 添加 CPUID 定义:Include/Register/Amd/Cpuid.h。

  14. CpuCommonFeaturesLib:修复错误启用 SMX/VMX 的错误。

  15. CpuMpDxe:修复可能导致 S4 恢复失败的错误。

  16. MtrrLib:重新实现库以确保始终可以计算最佳 MTRR 设置。

  17. MpInitLib:

    1. 重新启用 AP 时完全初始化 AP。
    2. 修复导致 AP 在源级调试启用环境中进入定时器中断处理程序的错误。
    3. 修复了在 SwitchBSP() 之后在新 BSP 中禁用定时器中断的错误。
    4. 修复了在 PEI 阶段为 AP 唤醒缓冲区找不到由于低于 1MB 的可用内存而导致系统挂起的错误。
    5. 修复了可能导致由于 StartupApSignal 引用错误导致 AP 无法唤醒的问题。
  18. CpuExceptionHandlerLib:修复导致无法在发布版本中转储异常信息的错误。

  19. PiSmmMCpuDxeSmm:修复启用 SMM 配置文件时潜在的无限循环问题。

  20. SecCore:修复了一个错误,以保证可以通过 SecPerformancePpi 获得正确的 SEC 性能数据。

  21. CpuCommonFeaturesLib:

    1. 修复 AESNI 特征检测。
    2. 修复 Haswell CPU 挂起 50% 的问题。
    3. 即使 MCA 已禁用,也不要无条件启用它。

EDK II Security White Papers

Kevin Shaw edited this page on 11 Dec 2020 · 15 revisions

A list of White Papers and information for EDK II Security from multiple sources

General:

EDK II Code:

Memory Protection:

SMM Protection:

SecureBoot/AuthVariable:

TrustedBoot/TPM2:

DMA: A Tour Beyond BIOS - Using IOMMU for DMA Protection in UEFI firmware (Oct 2017)

Capsule/Recovery: A Tour Beyond BIOS - Capsule Update and Recovery in EDK II (Dec 2016)

S3: A Tour Beyond BIOS - Implementing S3 Resume with EDK II (Oct 2015)

Profile: A Tour Beyond BIOS - Implementing Profiling in EDK_II (July 2016)

STM/VMM:

StandaloneMM: A Tour Beyond BIOS - Launching Standalone SMM Drivers in the PEI Phase using EDK II (May 2015)

Home | Getting Started with EDK II | Reporting Issues | Community Information | Community Support | Tasks | BSD+Patent

 Pages 359

Wiki Navigation:

Home
Getting Started with EDK II
EDK II Platforms
EDK II Documents
EDK II Release Planning
Reporting Issues
Reporting Security Issues
Community Information
Additional Projects & Tasks
Training
Community Support
Community Virtual Meetings

Clone this wiki locally

 

Code Style C

Laurie Jarlstrom edited this page on 6 Apr 2016 · 3 revisions

This is just a brief overview of the C Code Style used for our projects. The official C Coding Standards specification can be found at:

Table of Contents

Overview

  • CamelCase used for variables, functions and file names
  • UPPERCASE used for types and macros
  • Use UEFI types rather than C types
    • int=>INTN; unsigned int=>UINTN; void=>VOID; etc...
  • Limit line length to 80 characters
  • 2 spaces of indentation
  • Never use tab characters.
    • Set editor to insert spaces rather than a tab character.
  • if, for, while, etc. always use { }, even when there is only one statement
    • The opening brace ({) should always appear at the end of the line previous line.
  • The opening brace ({) for a function should always appear separately on the a new line.

Example of Properly Formatted Code

C File Example:

 /**
   Brief and Detailed Descriptions.
 
   @param[in]      Arg1 Description of Arg1.
   @param[in]      Arg2 Description of Arg2, which is optional.
   @param[out]     Arg3 Description of Arg3.
   @param[in, out] Arg4 Description of Arg4.
 
   @retval EFI_SUCCESS   Description of what EFI_SUCCESS means.
   @retval !EFI_SUCCESS  Failure.
 
 **/
 EFI_STATUS
 EFIAPI
 FooName (
   IN     UINTN  Arg1,
   IN     UINTN  Arg2 OPTIONAL,
      OUT UINTN  *Arg3,
   IN OUT UINTN  *Arg4
   )
 {
   UINTN Local;
   UINTN AnotherLocal;
 
   ...
 
   for (Local = 0; Local < 5; Local++) {
     if (Local == 2) {
       Print (L"Local: %d (yes! 2)\n", Local);
     } else {
       Print (L"Local: %d\n", Local);
     }
   }
 
   ...
 }

H File Example:

 #define FOO_MACRO(a, b) ((a) * (b))
 
 #define FOO_CONSTANT  0xcafe
 
 /**
   Brief and Detailed Descriptions.
 
   @param[in]      Arg1 Description of Arg1.
   @param[in]      Arg2 Description of Arg2, which is optional.
   @param[out]     Arg3 Description of Arg3.
   @param[in, out] Arg4 Description of Arg4.
 
   @retval EFI_SUCCESS   Description of what EFI_SUCCESS means.
   @retval !EFI_SUCCESS  Failure.
 
 **/
 EFI_STATUS
 EFIAPI
 FooName (
   IN     UINTN  Arg1,
   IN     UINTN  Arg2 OPTIONAL,
      OUT UINTN  *Arg3,
   IN OUT UINTN  *Arg4
   );
 
 ...
 
 #endif

Examples

CamelCase

Used for variables, functions and file names

Correct:

 #include "FooFileName.h"
 ...
 VOID SuperFunction (
 ...
   UINTN ALocalVariable;
   UINTN UefiVersion;

Incorrect:

 #include "foo-file_name.h"
 ...
 VOID superFunction (
 ...
   UINTN a_local_variable;
   UINTN UEFIVersion;

UPPERCASE

Used for types and macros

Correct:

 #define FOO_MACRO(a, b) ((a) * (b))
 typedef struct _STRUCT_NAME STRUCT_NAME;
 struct _STRUCT_NAME {
   ...
 };

Incorrect:

 #define FooMacro(a, b) ((a) * (b))
 #define Foo_Macro(a, b) ((a) * (b))
 typedef struct _Struct_Name StructName;

Use UEFI types

Don't use C types directly

Correct:

   INTN   ALocalVariable;
   UINTN  UefiVersion;
   VOID   *Ptr;

Incorrect:

   int           ALocalVariable;
   unsigned int  UefiVersion;
   void          *Ptr;

2 spaces of indentation

Correct:

   if (TRUE) {
     Print (L"Hello, world!\n");
   }

Incorrect:

   if (TRUE) {
       Print (L"Hello, world!\n");
   }

Always use { }

If, for, while, etc. always use { }, even when there is only one statement

Correct:

   if (TRUE) {
     Print (L"Hello, world!\n");
   }

Incorrect:

   if (TRUE)
     Print (L"Hello, world!\n");

猜你喜欢

转载自blog.csdn.net/tianpu2320959696/article/details/116422672
今日推荐