一、UEFI开发环境配置

UEFI开发环境目前支持Windows,Linux,支持的平台也有很多如Intel, AMD,ARM等。

下面主要是介绍如何在windows环境下进行EDK开发。

1.获取EDK源码

EDKII 源码的获取有很多途径

(1)GitHub - tianocore/edk2: EDK II (建议用这个)

(2)p/edk2/code - Revision 29574: /trunk/edk2

基本上以最新的为主,但是也要看一下最新的EDK sourcecode是否有什么问题。EDK会Release稳定的版本,像UDK2014、UDK2015、UDK2017、UDK2018都是稳定的版本。

2.搭建EDK运行环境,参考如下链接:

https://github.com/tianocore/tianocore.github.io/wiki/UDK2018-How-to-Build#how-to-build-windows-system

3. 编译EDK模拟器

二、UEFI开发环境配置

1.获取EDK源码

 2.搭建EDK运行环境

a)安装VS2015

注意需要安装ARM64(包含在C++组件中),否则会报错:

NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio14.0\Vc\Bin\cl.exe...“

C:\Program"不是内部或外部命令,也不是可运行的程序

b)安装NASM(nasm-2.15.05-installer-x64.exe)

默认的安装路径为C:\Program Files\NASM

c) 安装python2.7(python-2.7.18.amd64.msi)

注意在安装界面选择将 Python 加入 Path

d) 准备Win32 BaseTool

https://github.com/tianocore/edk2-BaseTools-win32.git,

解压之后放在 BaseTools\Bin\Win32目录下。

3.编译EDK模拟器(Nt32Pkg)

a)打开命令行窗口,进入EDK代码目录,执行edksetup.bat --nt32,用于配置Nt32Pkg编译所需的环境。

类似于虚拟机,可以在这个窗口下调试纯软件的程序,如果程序涉及硬件,这个是没有用的。

运行后在conf下面生成三个配置文件:build_rule、target、tools_def。

这三个文件主要是用来配置编译环境和设定编译规则,在生成以后,根据自己的PC来设定编译使用的tool。一般我们只需要设定

target.txt这个文件即可。为了后面编译的时候,不需要每次都指定编译使用的VS版本,target.txt里先指定为VS2015x86,如下所示。

TARGET_ARCH = IA32表示编译的为32位程序,X64表示编译的为32位程序,还有的架构包括ARM等。

TOOL_CHAIN_TAG = VS2015x86表示在64位的Windows上编译程序,VS2015表示在32位的Windows上编译程序,其它的可以不用修改。

b)执行完edksetup.bat --nt32和配置好target.txt文件后,命令行窗口直接输入build命令即可。

c) build完成以后,直接输入命令build run,即可运行EDK模拟器。

至此,Windows UEFI开发环境配置(模拟器版本)就基本上结束了。

搭建过程可能遇到的一些编译问题:

1.NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio14.0\Vc\Bin\cl.exe...“

C:\Program"不是内部或外部命令,也不是可运行的程序

解决方法:如前所述,VS安装时,选择安装ARM64(包含在C++组件中)

2. ‘nasm’ is not recognized as an internal or external command, operable program or batch file

解决方法:添加nasm安装路径到环境变量。

便捷方式  --  在edksetup.bat中添加 path C:\Program Files\NASM;%path%

3.File “GenFds\GenFds.py”, line 24, in <module> ValueError: Attempted relative import in non-package

解决方法:将路径BaseTools\Bin\Win32下GenFds.exe更名为GenFds.LABZ,并将BaseTools\BinWrappers\WindowsLike;添加到Path路径中

在edksetup.bat中添加 path BaseTools\BinWrappers\WindowsLike;%path%

4. ‘python.exe’ is not recognized as an internal or external command, operable program or batch file

解决方法:设置PYTHON_HOME环境变量

便捷方式  -- --  在edksetup.bat中添加 set PYTHON_HOME=C:\Python27

注:

1、在build的过程中,可能会有一些提示报错,要善于分析报错原因并解决问题。

2、EDK build命令还有很多,如果只输入build,是按照Target.txt的默认配置来的,同时也可以指定build某个package,也可以指定tool,也可以指定生成多少位程序。

如:build -p [PlatformFile] -a [Architecture] -t [ToolChain]

三、工程模块概要

在代码的根目录下,有许多以*Pkg命名的文件夹,每一个这样的文件夹可以称之为一个package。但准确的说,Package是一组模块(Module)和平台描述文件(.dsc文件)、包声明文件(.dec文件)组成的集合。

在Windows下使用VS(Visual Studio)时,通常要建立工程文件和源文件。类似的,在EDK2环境下,我们除了编写源文件外,还要为工程编写元数据文件(.inf文件)。.inf文件与VS的工程文件功能类似,用于自动编译源代码。

包相当于VS中的项目,.dsc文件则相当于VS项目的.sln文件;模块相当于VS项目中的工程,.inf则相对于VS工程的.proj文件。

EDK2中主要的模块类型如下:、

模块类型

说明

标准应用程序工程模块

在DXE阶段运行的应用程序(Shell环境下也可以运行)

ShellAppMain应用程序工程模块

Shell环境下运行的应用程序

Main应用程序工程模块

Shell环境下运行的应用程序,并且应用程序链接了StdLib库

UEFI驱动模块

符合UEFI驱动模型的驱动,仅在BS期间有效

库模块

作为静态库被其他模块调用

DXE 驱动模块

DXE环境下运行的驱动,此类驱动不遵循UEFI驱动模型

DXE运行时驱动模块

进入运行期仍然有效的驱动

DXE SAL驱动模块

仅对安腾CPU有效的一种驱动

DXE SMM驱动模块

系统管理模式驱动,模块被加载到系统管理内存区。系统进入运行期改驱动仍然有效

PEIM模块

PEI阶段的模块

SEC模块/PEI_CORE模块/DXE_CORE模块

固件的SEC阶段/固件的PEI阶段/固件的DXE阶段

四、标准应用程序工程模块

标准应用程序工程模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块。

每个工程模块由两个部分组成:工程文件和源文件。源文件包括C/C++文件、 .asm汇编文件,也可以包括.uni(字符串资源文件)和.vfr(窗体资源文件)等资源文件。

下面是一个简单的应用程序工程模块的组成:

 

五、标准应用程序工程模块--源文件

源文件UefiMain.c:仅有一个函数UefiMain,UefiMain是这个模块的入口函数,其功能是向标准输出设备输出字符串。

关于入口函数:

1.UEFI标准应用程序的入口函数通常是UefiMain,也可以在工厂文件.inf中定义新的入口函数

2.入口函数的函数名可以变化,但其函数原型(返回值类型和参数列表类型)不能变化。

六、标准应用程序工程模块--工程文件

在UefiMain这个例子中,还有一个UefiMain.inf的文件。这个文件是工程文件,用于指导EDK2编译工具自动编译模块。.inf(Module Information File)文件就相当于Makefile文件或者Visual Studio的.proj文件。

工程文件分为很多个块,每个块以”[块名]”开头,”[块名]”必须单独占一行。有些块名是所有工程都必须的块,这些块包括[Defines]、[Sources]、[Packages]和[LibraryClasses]。其他的块并不是每个模块都一定要编写的块,仅在用到的时候需要编写这些块。

工程文件必须块如下:

必须块

块描述

[Defines]

定义本模块的属性变量及其他变量,这些变量可在工程文件其他块中引用

[Sources]

列出本模块的所有源文件及资源文件

[Packages]

列出本模块应用到的所有包的包声明文件。可能引用到的资源包括头文件、GUID、Protocol等,这些资源都声明在包的包声明文件.dec中

[LibraryClasses]

列出本模块要链接的库模块

工程文件非必须块如下:

非必须块

块描述

[Protocols]

列出本模块用到的Protocol

[Guids]

列出本模块用到的GUID

[BuildOptions]

指定编译和链接选项

[Pcd]

列出本模块用到的Pcd变量

[PcdEx]

列出本模块用到的Pcd变量

[FixedPcd]

列出本模块用到的Pcd编译期变量

[FeaturePcd]

列出本模块用到的Pcd变量

[PatchPcd]

列出的Pcd变量仅本模块

INF_VERSION        :INF标准的版本号。EDK2的build会检查INF_VERSION的值并根据这个值解析.inf文件。

BASE_NAME         : 模块名字字符串,不能包含空格。通常也是输出文件的名字。

FILE_GUID             : 每个工程文件必须有一个8-4-4-4-12格式的GUID,用于生成固件。

VERSION_STRING :模块的版本号字符串。

MOUDLE_TYPE     :定义模块的模块类型。可以是SEC/PEI_CORE/PEIM/DXE_CORE/DXE_SAL_DRIVER/DXE_SMM_DRIVER/UEFI_DRIVER/DXE_DRIVER/DXE_RUNTIME_DRIVER/UEFI_APPLICATION/BASE中的一个。

ENTRY_POINT       :定义模块的入口函数。

七、其他类型工程模块  ---Shell应用程序工程模块

标准应用程序处理命令行参数很不方便,而能在Shell中执行的命令(命令也是应用程序)通常都会带有命令行参数,为了方面处理参数,EDK2提供一种以INTN ShellAppMain(IN UINTN Argc,IN CHAR16 **)作为入口函数的模块,即Shell应用程序工程模块。

因为在入口函数的参数中没有了SystemTable,所以要通过全局变量gST使用系统表。入口函数ShellAppMain的第一个参数Argc是命令行参数个数,第二个参数Argv是命令行参数列表。Argv列表中的每个参数都是Unicode字符串(CHAR16* 类型的字符串)

除了入口函数方面的差异,在工程文件(inf文件)中也存在差异:

ENTRY_POINT必须为ShellCEntryLib,源程序中必须提供ShellAppMain

[Packages]块中,必须列出ShellPkg/ShellPkg.dec

[LibraryClasses]块中,必须列出ShellCEntryLib

在库模块的工程文件中,需要设置MODULE_TYPE为BASE;设置LIBRARY_CLASS为library的名字。同时不要设置ENTRY_POINT。

有些库仅能被某些特定的模块调用时,需要在工程文件中声明库的使用范围,声明方法是在[Defines]块的LIBRARY_CLASS变量中定义,格式如下:

LIBRARY_CLASS = 库名字  | 适用模块类型1 适用模块类型2

编写了库之后,要使库能被其他模块调用,还要在包的.dsc文件中声明该库。

如果库使用前需要进行初始化,在库的工程文件需指定CONSTRUCTOR和DESTRUCTOR。 CONSTRUCTOR会在ENTRY_POINT之前执行, DESTRUCTOR会在ENTRY_POINT之后执行。

八、其他类型工程模块  ---UEFI 驱动模块

在UEFI中,驱动分为两类:一类是符合UEFI 驱动模型的驱动,模块类型为UEFI_DRIVER,称为UEFI驱动,另一类是不遵循UEFI驱动模型的驱动,模块类型包括DXE_DRIVER、DXE_SAL_DRIVER、DXE_SMM_DRIVER、DXE_RUNTIME_DRIVER,称为DXE驱动。

驱动与应用程序的模块入口函数(ENTRY_POINT)类型一样。函数原型如下:

工程模块方面的差异主要为:

1.[Defines]块中,MODULE_TYPE设置为UEFI_DRIVER。

2.[Sources]块中,通常包含有ComponentName.c,此文件定义了驱动的名字,驱动安装后,名字将显示给用户。

3.[LibraryClasses]块中,必须包含UefiDriverEntryPoint。

九、包及dsc/dec/fdf文件  ---概要

每个Package(包)包含一个.dec(Package Declaration File)文件、一个.dsc(Platform Description File)文件。如果一个包还要生成固件Image或Option Rom Image,这个包还要包含.fdf(Flash Description Files)。

下面是这些文件如何整合成一个Image的过程:

Build命令用于编译包,它需要一个.dsc文件、一个.dec文件以及一个或多个.inf文件。

GenFW命令用于制作固件或Option RomImage,它需要一个.dec文件和一个.fdf文件。

十、包及dsc/dec/fdf文件  ---dsc文件

.inf用于编译一个模块,而.dsc文件用于编译个一个Package,它包含[Defines]、[LibraryCalsses]、[Components]几个必须部分以及[PCD]、[BuildOptions]等几个可选部分。

[Defines]

用于设置Build相关的全局宏变量,这些变量可以被.dsc文件的其他模块引用。必须是.dsc文件的第一个部分。通过DEFINE和EDK_GLOBAL定义的宏可以在.dsc文件和.fdf文件中通过$(宏变量名)使用。

[LibraryClasses]

定义库的名字以及库.inf文件的路径。这些库可以被[Components]块内的模块引用。

[Components]

在该区域内定义的模式都会被build工具编译并生成.efi文件

[PCD]

用于定义平台配置数据。其目的是在不改动.inf文件和源文件的情况下完成对平台的配置。

十一、包及dsc/dec/fdf文件  ---dec文件

.dec文件定义了公开的数据和接口,供其他模块使用。它包含了必须区块[Defines]以及可选区块[Includes]、[Guids]、[LibraryClasses]、[Protocols]、[Ppis]和[PCD]几个部分。

[Defines]

提供package的名称、GUID、版本号等信息

[Includes]

列出本Package提供的头文件所在的目录。路径起始于本Package的.dsc所在的目录。

[LibraryClasses]

Package可以通过.dec文件对外提供库,每个库都必须有一个头文件。本区块用于明确库和头文件的对应关系。

[Guids]

用于定义工程文件(inf)中[Guids]使用到的GUID。

[Protocols]

与[Guids]块相同,用于是Protocol GUID定义的地方。

十二、包及dsc/dec/fdf文件  ---fdf文件

fdf(Flash Description File)用于生成固件映像,定义Image的内容和布局信息,它由[Defines],[FD],[FV],[Rule]等几个部分组成

常用缩写:

FD:固件设备,指任何可以存储固件的设备或设备集合:

FV:固件卷,指在FD上一个连续的部分,可以看成是一个逻辑设备,经常提到的FFS概念也是以FV的形式存在,它描述了FV中的文件组织形式;FF:固件文件,指在FV上组织代码和数据的一个集合;

FFS:FV上的文件实际上是以FFS的形式保存在FV上;

FDF:描述整个FD,以及各个FV,我们想了解FD中都有哪些FV,只要查看FDF文件即可;

fdf(Flash Description File)用于生成固件映像,定义Image的内容和布局信息,主要使用到[Defines],[FD],[FV]这几个部分组成

[Define]

这部分Section是可选的,里面放置到的东西一般用来放宏定义和变量

[FD]

1.一个FDF文件里面可以有多个FD

2.[FD]中包含几个有特殊意义的变量,如下:

BaseAddress:表示FD的基址,它是设备开机之后BIOS被加载到系统中的位置;

Size:表示FD的大小,单位是字节;

ErasePolarity:表示的是用1还是0擦Flash,目前基本上都是1;

BlockSize:表示Flash中一个Block的大小,一般就是4K,64K等;

NumBlocks:表示Flash中Block的个数,通常就是Size除以BlockSize;

3. [FD]中另外包含的一个重要的内容是FD的布局,描述结构如下,该定义在FD中开辟了一段空间,用来放置某些

内容,比如FV之类的。

Offset和Size是这段空间的对于整个FD的偏移和大小,Pcd是可选的,其实就是初始化了PCD来表示这段空间偏移和大小供后续使用,并不是必须的,它可以在FDF文件的各处使用;RegionType表示这段空间的类型,可以是FV、DATA、FILE

[FV]

定义FV中具体包含什么模块文件。

FV是可以嵌套的

[FV]的最开始是几个TOKEN,代表一些属性设定

[FV]中也可以使用DEFINE和SET来定义宏和变量。

[FV] Section中使用INF语句来指定FV中包含什么文件

[FV]中可以直接包含文件,使用的是FILE语句

EDK环境搭建UEFI工程模块文件介绍相关推荐

  1. UEFI原理与编程实践--UEFI工程模块文件

    标准应用程序工程模块 该模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块,标准应用程序工程模块,UefiMain就是这个模块的入口函数 EFI_STATUS EFIAPI U ...

  2. 启明云端分享|ESP32-S3开发环境搭建,这里我们会介绍两个比较常用的开发环境搭建:WINDOWS\LINUX

    ESP32-S3开发环境搭建,这里我们会介绍两个比较常用的开发环境搭建:WINDOWS\LINUX 详细安装步骤概览 注:目前master分支,支持S3. 官方开发文档:包含多种平台 https:// ...

  3. LAMP服务器环境搭建及工程部署

    LAMP服务器环境搭建及工程部署 这篇文章是我之前讲的环境搭建和项目部署视频讲解的文字版本,由于之前直播录屏的时候没有空闲的服务器进行搭建,所以没有详细的截图等可以展示. 现在刚好我手头有一台vps刚 ...

  4. DVWA环境搭建教程-手把手最详细介绍

    DVWA环境搭建教程-手把手最详细介绍 安装phpstudy 安装DVWA 安装环境:win7 安装phpstudy 1.下载安装phpstudy 百度搜索phpstudy,在官网上下载 链接: ht ...

  5. Opencascade源码学习之模型算法_TKO模块文件介绍

    Opencascade源码学习之模型数据_TKO模块文件介绍 1.TKO 1.BOPAlgo 2.BOPDS 3.BOPTools 4.BRepAlgoAPI 5.IntTools 1.TKO 1.B ...

  6. Opencascade源码学习之模型数据——TKGeomBase模块文件介绍

    Opencascade源码学习之模型数据--TKGeomBase模块文件介绍 1.AdvApp2Var 2.AppCont 3.AppDef 4.AppParCurves 5.Approx 6.Bnd ...

  7. OpenHarmony设备的开发环境搭建与工程管理(Ubuntu系统环境)

    文章目录 开始前的废话 本篇文章是介绍在**Ubuntu环境**下,如何搭建一套完整的可视化开发环境.笔者经过测试Ubuntu 20.04系统环境下操作都可以实现. 开发环境的搭建 第一步: 修改Ub ...

  8. SSM+nginx+tomcat+maven+mysql+redis环境搭建及工程全套配置,实现前后端动静分离

    目录 前言 服务器环境搭建 windows开发环境 SSM搭建 加入redis(注解形式) nginx与tomcat关联配置,完成前后端连接 前言 本次采用前后端分离模式,前端以html.css.js ...

  9. Windows Java JavaFX IntelliJ IDEA 开发环境搭建 创建工程 编译运行 打包分发 自定义运行时

    博文目录 文章目录 本文说明 JavaFX 简单说明 JavaFX 版本说明 JavaFX 与 JDK 的关系 JavaFX 与 JDK Modular (JDK 9 模块化系统) JavaFX 模块 ...

最新文章

  1. VS2015 win64下配置Opencv3.4.7
  2. 一些关于Hibernate延迟加载的误区
  3. 2012 RDS Remote App 对于win7的支持问题
  4. SQLite基本操作
  5. nginx的hash表结构
  6. Windows下Oracle 11g创建数据库
  7. LeetCode-链表-160. 相交链表
  8. Halcon知识:如何画出灰度图像直方图
  9. 影响了一代代前端人的 20 个里程碑式的顶级开源项目!- 2006 - 2021
  10. python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区
  11. 【Go 框架开发】Zinx 框架开发笔记
  12. 远程连接服务器出现 SQL Error (1130): Host IP is not allowed to connect to this MySQL server 错误...
  13. Java--继承(三)
  14. 基于JEECG框架,前台VUE,后台java,导入导出
  15. 使用jsp实现留言板功能
  16. HP M1136无法打印的解决方法
  17. 常见的数据结构和数据库的设计方法
  18. ubuntu下u盘变成只读模式
  19. 移动通信技术的毫米波波束成形系统构成
  20. 再论人与人的三大关系:生存关系、性关系和经济关系

热门文章

  1. 问题解决:pdf打不开,出现Acrobat failed to connect to a DDE server问题
  2. 以某乎为实战案例,教你用Python爬取手机App数据!居然有人说爬不了APP!
  3. 《数字图像处理》第三章学习总结感悟1:灰度变换与空间滤波概念及常用灰度变换方法介绍
  4. android4.4中添加方案,Android4.0-4.4 添加实体按键振动支持的方法(java + smali版本)
  5. 【深度学习】Fashion-MNIST数据集简介
  6. 计算机win7如何加快开机速度,电脑启动越来越慢如何提升win7开机速度
  7. 路由器设置多WAN口要点技巧
  8. opencv28:分水岭算法的图像分割
  9. FA-PEG-SH 叶酸PEG巯基
  10. 关于微信公众号accesstoken