UEFI实战——EDK的编译流程说明

前言

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

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

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

编译工具

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\BaseTools
 EDK_TOOLS_BIN      = E:\Codes\vUDK2017\BaseTools\Bin\Win32
     CONF_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文件生成真正的二进制。

发布了197 篇原创文章 · 获赞 193 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/jiangwei0512/article/details/97685496