前言

使用EDK进行UEFI开发,开始的时候很容易遇到的问题就是编译不过,并非代码的问题,而是编译环境存在异常。

本文主要介绍EDK是如何进行编译的,使用的平台是Windows。这里还想说一点,事实上Linux下的EDK编译相比Windows还更简单一些,但是在实际的开发中,会需要使用到Intel提供的各类工具,而这些工具只有Windows版本的,所以开发一般还是需要在Windows平台。

本文涉及到具体的EDK版本,一般说的是vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.,它(后面称为源码)其实是来自GitHub - tianocore/edk2: EDK II,只是有一些自己的修改。

编译工具

EDK编译需要使用到的工具有如下的一些:

Visual Studio:这是主要的编译工具,当然又备选的Intel自己的编译工具,但是VS是最常用的,从VS2010开始,各个版本的VS都支持,在【UEFI实战】OVMF基础已经说明了如何安装VS。需要说明的是,其实并不需要安装VS也能够使用到它的工具来进行编译,后续会说明这一点。

Python:EDK在编译的前期处理中使用了大量的Python脚本(也有可能是封装成exe的Python脚本),来生成编译必须的C文件,H文件和Makefile文件,另外,某些EDK二进制本身就是通过Python脚本来生成的,所以Python必不可少。目前Python2.7是一般的EDK都支持的。

NASM:EDK中一部分的代码是汇编语言,汇编语言在Windows下可以通过NASM或者MASM来编译,它们对应的汇编语言稍有不同,可能是为了兼容性的问题(Linux下也有NASM,但是MASM是微软的,没有Linux版本),在EDK中NASM更常用。

ASL:EDK中比较特殊的就是ACPI语言,它需要通过ASL工具来进行编译,所以它也是必不可少的。

还有,某些比较老的EDK版本,需要使用到WINDDK的工具,这个只要知道有这么一回事情即可。

最后,在EDK的源代码中,还有一个目录BaseTools,它包含了EDK自己要用的一些工具,这些工具包含了Windows版本,Python版本和Linux版本。以源码为例,它默认不包含Windows版本工具,只给了一个链接,需要自己去下载,但是也可以通过工具从Python版本转化而来(其实下载来的Windows版本也是通过Python转换过来的,使用的工具是cx_Freeze);Linux版本需要自己先编译出来才能使用。

另外,非常重要的一点,上述的工具最好是安装在默认目录(一般就是C盘的特定位置),如果不在默认的位置,就很可能出现异常。

配置

前面介绍了EDK编译需要使用的工具,但是我们如何来使用这些工具呢?“默认目录”到底是指哪个目录呢?本节将介绍这部分的内容。

我们在编译EDK之前,需要先运行一个脚本,它的名字是edksetup.bat,通过名字也可以看出来它的作用。

其中很重要的一部分就是调用BaseTools\toolsetup.bat,同样从它的名字也可以看出来这个脚本的作用。

在toolsetup中,有如下的操作:

1. 设置一些变量,其中就有EDK默认提供的工具的位置EDK_TOOLS_PATH,BASE_TOOLS_PATH,EDK_TOOLS_BIN等,这些变量就指定了我们应该去哪里获取EDK自己提供的工具;同时它还给PATH这个环境变量上增加了EDK工具的目录,这样Windows下就可以直接调用这些工具,而不需要使用绝对路径了。运行edksetup.bat的时候会有如下的打印,就是设置的变量:

          PATH      = E:\Codes\vUDK2017\BaseTools\Bin\Win32;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\Program Files\Git\cmd;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files\TortoiseGit\bin;D:\Program Files\qemu;C:\Users\home\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Microsoft VS Code\bin;D:\Program Files\qemu;WORKSPACE      = E:\Codes\vUDK2017
EDK_TOOLS_PATH      = E:\Codes\vUDK2017\BaseTools
BASE_TOOLS_PATH     = E:\Codes\vUDK2017\BaseToolsEDK_TOOLS_BIN      = E:\Codes\vUDK2017\BaseTools\Bin\Win32CONF_PATH      = E:\Codes\vUDK2017\Conf

2. 之后,在toolsetup.bat中会调用set_vsprefix_envs.bat这个脚本,看它的名字就可以看出来它是用来处理VS相关的内容的。前面已经提到,EDK支持不同版本的VS,在VS安装的过程中,会设置一个变量,比如这边安装的是VS2015,可以在系统变量中看到VS140COMNTOOLS这个变量:

通过这个变量,我们就可以知道目前的编译环境中装了哪个版本的VS,从而进一步指定VS下的工具目录,并初始化对应的变量。

除此之后,set_vsprefix_envs.bat中还会设置WINDDK和ASL的目录。

3. 下面回到toolsetup.bat,之后的操作非常重要,它创建一个Conf目录(这也是本节标题的来源),然后往这个目录中放入target.txt,tools_def.txt和build_rule.txt。这三个文件不是凭空生成的,而是在BaseTools目录下存在模板:

这样做的好处是,我们可以手动修改Conf目录下的这三个文件,来做出自定义。

下面来一一介绍这几个文件:

1)首先是build_rule文件,之所以要先讲是因为我也不知道它是干什么的,跳过。

2)然后是target,这个目录主要是配置如下的一些值:

ACTIVE_PLATFORM:指定编译的dsc文件;

TARGET:指定是Release版本还是DEBUG版本;

TARGET_ARCH:指定平台是32位还是64位还是两者皆有;

TOOL_CHAIN_CONF:指定使用的工具包,一般就是tools_def.txt;

TOOL_CHAIN_TAG:指定具体使用的工具及其版本,就是用VS还是其它编译器之类的,后面讲tools_def的时候还会说明;

MAX_CONCURRENT_THREAD_NUMBER:指定参与编译的核数;

BUILD_RULE_CONF:指定使用的规则,一般就是build_rule.txt;

以上的这些参数,在使用编译命令的时候大部分都可以Override,所以这里指定并不一定有效;

3)tools_def文件列出了所有支持的编译器和对应的变量,以及不同编译器需要使用的参数。以这边是用的VS2015x86为例,它设置了如下的变量(当然实际上还有很多):

DEFINE VS2015x86_BIN    = ENV(VS2015_PREFIX)Vc\bin
DEFINE VS2015x86_DLL    = ENV(VS2015_PREFIX)Common7\IDE;DEF(VS2015x86_BIN)
DEFINE VS2015x86_BINX64 = DEF(VS2015x86_BIN)\x86_amd64

这里的VS2015_PREFIX就是在set_vsprefix_envs.bat设置的。

通过上述的变量,我们也可以确定EDK编译的时候到底去哪个目录获取工具了。

我们在target中定义的TOOL_CHAIN_TAG,或者在调用build时通过的-t传入的参数,必须在tools_def中定义,否则build就会报错。

build

工具已经安装,配置也已经有了,下面就是最重要的编译。

关于build工具的使用,我们先来看下面的操作:

我们在EDK目录下直接调用build,会提示不是可用的命令。

然后我们运行edksetup.bat,我们从前面的介绍里面已经知道,它会设置BaseTools下的工具目录到PATH系统变量中,所以之后的build就能够识别到了,所以操作能够执行。

实际的build在如下的目录:

我们可以进一步查看它的使用方法:

有一部分参数已经在前面提过,这里也不再赘述。

同时我们还可以找到它的Python版本:

它才是真正的EDK编译的重点。

关于build具体做了哪些操作,可以直接查看build.py以及相关的代码。

不过代码比较多且复杂。

这里只做简单的说明:

1. 文本转换。EDK里面除了c文件,h文件等常用的编程语言文件,还有inf文件,dec文件,dsc文件,fdf文件等等,这些本质上不是编译语言文件,而是为了方便EDK编程而使用的帮助文件,这些文件最终会通过build命令进行转化,生成新的文件(我们可以在Build目录下找到AutoGen.c,Makefile等),它们才是真正编译需要用到的;

2. 调用VS工具,并配置之前生成的Makefile文件来进行编译;

3. 通过fdf文件生成真正的二进制。

【UEFI实战】EDK的编译流程说明相关推荐

  1. 【UEFI实战】FSP简介

    说明 在[UEFI实战]SlimBootloader简介中有说到,编译Slim Bootloader的时候需要使用到FSP,本文就是用来介绍FSP是什么,它的作用,以及如何编译等内容. 什么是FSP ...

  2. 【UEFI实战】LinuxBoot

    综述 LinuxBoot是一个开源的固件,用来替代UEFI BIOS加载Linux的系统. 官网是LinuxBoot. 对应的代码库位于LinuxBoot · GitHub. 另外,本文是在[UEFI ...

  3. EDK II编译过程

    1 EDKII Build过程简介 EDKII Build主要是用来处理EDKII meta-data文件(包括build_rule.txt,tools_def.txt,target.txt等),ED ...

  4. gcc编译流程及中间表示层RTL的探索

    gcc编译流程及中间表示层RTL的探索收藏 新一篇: 解读VC++编程中的文件操作API和CFile类 | 旧一篇: Effective Item21 尽可能使用const 内容摘要 本文将以 C 语 ...

  5. 最纯粹的直播技术实战01-FFmpeg的编译与运行

    最纯粹的Android直播技术实战01-FFmpeg的编译与运行 最新实战教程,Android自动化刷量.作弊与防作弊,案例:刷友盟统计.批量注册苹果帐号 这个系列的文章将会研究最纯粹的Android ...

  6. C 语言编程 — 程序的编译流程

    目录 文章目录 目录 文章目录 C 程序的编译流程 预处理 编译 汇编 链接 编译多个源文件 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程序的编译流程> ...

  7. 深入剖析 iOS 编译 Clang LLVM(编译流程)

    2019独角兽企业重金招聘Python工程师标准>>> 前言 iOS 开发中 Objective-C 和 Swift 都用的是 Clang / LLVM 来编译的.LLVM是一个模块 ...

  8. esp8266 SDK开发之编译流程

    最近刚完成自己8266的小项目,已经发布在github上,有兴趣的朋友可以看一下 github地址:esp-ujn 1. 通过MQTT协议与服务器交互 2. 内置HTTP服务器,支持通过浏览器进行参数 ...

  9. 4-uboot编译流程

    [uboot] (第四章)uboot流程--uboot编译流程 2016年11月01日 21:23:36 阅读数:2983 以下例子都以project X项目tiny210(s5pv210平台,arm ...

最新文章

  1. 关于ExtJS在使用下拉列表框的二级联动获取数据
  2. pytorch 加载模型 模型大小测试速度
  3. java获取字符串最长_基于java查找最长字符串代码实例
  4. C++中的赋值操作符重载
  5. mysql全备份+增量备份笔记总结
  6. 图灵奖得主Jeff Ullman:机器学习不是数据科学的全部!统计学也不是!
  7. 力扣 数组中的最长山脉
  8. CentOS 6.5静态IP的设置(NAT和桥接联网方式都适用)
  9. 电路与模拟电子技术(作业答案)
  10. coreldraw x4如何重叠图片_怎么用CDR x4(coreldraw x4)裁剪图片?x4怎么自动抠图
  11. 如何使用PS修改图片背景
  12. SAP 安全证书的导入
  13. Mysql数据库主主从设置
  14. TSINGSEE青犀视频构建pion webrtc运行broadcast示例的步骤
  15. 日期转换 例如 二零零六年十二月二十一日 转换成 2006年12月21日
  16. .NET导出Excel(复杂表头)
  17. Attention机制的精要总结,附:中英文机器翻译的实现!
  18. 自学游戏建模,有什么适合新手学习的3D建模软件?
  19. ROS-Melodic-Moveit 实时控制UR5机械臂
  20. python如何绘制条形图_python Matplotlib 系列教程(三)——绘制直方图和条形图

热门文章

  1. V2X消息之SPAT消息解读
  2. 每周分享第 25 期
  3. Guitar Pro8吉他打谱下载自学制作教程
  4. 关于脑电波的黑科技,离我们生活还有多远。
  5. 电脑 蓝屏报错:SYSTMEM SCAN AT RAISED IRQL CAUGHT IMPROPER DRIVER UNLOAD
  6. jsf的verbatim标签
  7. 计算机如何接6块显卡,双显卡怎么切换到独立显卡 5步轻松搞定【图文教程】
  8. 刻意练习+一万小时定律+异类
  9. Mixpanel使用注意点
  10. win10解决IE浏览器安装不上的问题(卸载依然显示不能安装)