EDK2-vUDK2018编译

  • Post author:
  • Post category:其他



一 。开发环境搭建:


1. 安装VS2013

2.下载工具Python2.7  IASL  NASM解压默认都放到C盘根目录

Python2.7 : https://www.python.org/downloads/release/python-2716/

IASL: https://acpica.org/downloads/binary-tools

NASM: https://www.nasm.us/

在用户变量里面添加PYTHON_HOME=C:\Python27的环境变量

(注意NASM_PREFIX可不设置,若设置必须保证正确)

在系统变量的path里面添加C:\Python27 和 C:\nasm两个项

3. 下载edk2-vUDK2018.zip源码

UDK2018:https://github.com/tianocore/edk2

4. 下载qemu虚拟机

https://qemu.weilnetz.de/


二。 编译:


打开VS2013命令行工具:

1.执行命令 : edksetup.bat

!!! WARNING !!! No CYGWIN_HOME set, gcc build may not be used !!!提示不需要处理

2.执行命令 : edksetup.bat rebuild

3.执行命令 : edksetup.bat –nt32

4.执行命令:build -a IA32 -p Nt32Pkg\Nt32Pkg.dsc -t VS2013 编译32位版本:


三。编译出错:

1.’C:\nasmnasm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。NMAKE : fatal error U1077: “”C:\nasmnasm”: 返回代码“0x1”Stop。

这是因为设置的NASM_PREFIX环境变量不正确造成的,要在变量后面加上反斜杠或者删除这个变量(注意此时需要删除掉源码然后重新解压出工程),然后重新打开控制台终端。

2.’C:\Program’ 不是内部或外部命令,也不是可运行的程序或批处理文件。NMAKE : fatal error U1077: “”C:\Program Files\Windows Kits\8.0\bin\x86\\rc.exe”: 返回代码“0x1”Stop。

这是因为VS2013版本问题,没有找到rc.exe命令,查看一下C:\Program Files目录没有找到Windows Kits文件夹。

解决办法:是将C:\Program Files (x86)文件夹下的Windows Kits目录拷贝到C:\Program Files文件夹下,进入Windows Kits目录,删除8.0目录,将8.1改为8.0运行:

build -a X64 -p Nt32Pkg\Nt32Pkg.dsc -t VS2013

编译64位版本,清除编译:

build clean -t VS2013


3.

在Windows下运行UEFI BIOS时报错 error 7000


BUILD过程中提示:

Processing meta-data ………… done!

Building … c:\edk2\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLi

b.inf [IA32]

build…

: error 7000: Failed to start command

C:\Program Files (x86)\Microsoft Visual Studio 9.0\Vc\bin\nmake.exe /nol

ogo tbuild [c:\edk2\Build\NT32IA32\DEBUG_VS2008x86\IA32\MdePkg\Library\PeiMemory

AllocationLib\PeiMemoryAllocationLib]

build…

: error 7000: Failed to start command

C:\Program Files (x86)\Microsoft Visual Studio 9.0\Vc\bin\nmake.exe /nol

ogo tbuild [c:\edk2\Build\NT32IA32\DEBUG_VS2008x86\IA32\MdePkg\Library\PeiServic

esLib\PeiServicesLib]

build…

: error F002: Failed to build module

c:\edk2\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib.inf

[IA32, VS2008x86, DEBUG]


分析:C:\Program Files (x86)\Microsoft Visual Studio 9.0\Vc\bin\nmake.exe /nologo tbuild,由这一句分析应该是nmake.exe的路径问题导致找不到nmake.exe,再看一下前面的路径容易发现,Program Files(x86)文件夹,就应该明白问题大概出在哪里了。虽然自己电脑是32位的,但好像有些机器C盘下的Program Files文件夹后面却不带(x86)


解决方案:所以最保险的方法还是看一下自己C盘下的Program Files后到底带不带(x86),之后,在修改target.txt中TOOL_CHAIN_TAG这一项的时候,决定是修改成VS2015x86还是VS2015,具体支持VS的哪些版本还是要看tools_def.txt文件。

4.报错处理:

最近浏览github上edk2的发布代码,注意到一个问题,现在发布的方式有点不一样了。之前过一段时间,就会发布一个完整的打包源代码,比如2018年3月发布的UDK2018,我一直都用这个开发的。不过,我没有找到UDK2019,更别说UDK2020了。为什么我关注这个呢?主要是因为这种打好包的源码,整理得比较好,也比较稳定,并且还提供完整的API文档。另外,如果直接git EDK2的主线,编程时会发现它其实缺一些包是,有的包些还需要在Google的项目中下载。(观察下https://github.com/tianocore/edk2下的.gitmodules就知道了)既然没有更新的打包源码,就只能用git下载最新的EDK2来编译了。之前的博客中,其实已经给了解决的方法了。但是没有详细讲如何搭建最新的EDK2编译环境,正好用这篇博客完整地说一遍。

1 将github上项目导入到gitee仓库上具体的方法可以参考我之前的博客:https://blog.csdn.net/luobing4365/article/details/105658274或者http://yiiyee.cn/blog/2020/04/21/%e4%bd%bf%e7%94%a8gitee%e4%b8%8b%e8%bd%bdgithub%e9%a1%b9%e7%9b%ae/

对edk2,我常用的项目包括edk2、edk2-platforms、edk2-libc,它们的github地址分别为:

https://github.com/tianocore/edk2.git

https://github.com/tianocore/edk2-platforms.git

https://github.com/tianocore/edk2-libc.git

为了更新submodules(子模块),以下的库也是必须的:

https://github.com/openssl/openssl

https://github.com/ucb-bar/berkeley-softfloat-3.git

https://git.cryptomilk.org/projects/cmocka.git

https://github.com/kkos/oniguruma

https://github.com/google/brotli

把它们都导入到gitee仓库上,以备后用。

2 。下载源码:

(以下的例子中,gitee上的仓库是我私有的,其他人是无法下载的。请替换为自己的仓库)在下载源码前,必须安装必要的编译工具,包括Visual Studio、Python、ASL和Nasm。安装方法在第22篇博客中已经讨论过了(UEFI开发探索22-环境搭建3),就不重复了。

首先需要安装Windows版本的git工具,下载地址为:https://git-scm.com/download/gui/win。下载后点击安装即可。右键,选择“Git Bash Here”,新建工作目录,并将常用的三个项目的源代码git下来,命令为:

$mkdir UEFIWorkspace

$cd UEFIWorkspace

$git clone git@gitee.com:luobing4365/edk2.git

$git clone git@gitee.com:luobing4365/edk2-libc.git

$git clone git@gitee.com:luobing4365/edk2-platforms.git

为了更新submodules,必须修改edk2目录中的.gitmodules,否则更新时,它还是去github上下载。把edk2\.gitmodules中的内容修改为(注意替换为自己的gitee仓库):

[submodule “CryptoPkg/Library/OpensslLib/openssl”]

path = CryptoPkg/Library/OpensslLib/openssl

url = git@gitee.com:luobing4365/openssl.git

[submodule “SoftFloat”]

path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3

url = git@gitee.com:luobing4365/berkeley-softfloat-3.git

[submodule “UnitTestFrameworkPkg/Library/CmockaLib/cmocka”]

path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka

url = git@gitee.com:luobing4365/cmocka.git

[submodule “MdeModulePkg/Universal/RegularExpressionDxe/oniguruma”]

path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma

url = git@gitee.com:luobing4365/oniguruma.git

[submodule “MdeModulePkg/Library/BrotliCustomDecompressLib/brotli”]

path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotli

url = git@gitee.com:luobing4365/brotli.git

[submodule “BaseTools/Source/C/BrotliCompress/brotli”]

path = BaseTools/Source/C/BrotliCompress/brotli

url = git@gitee.com:luobing4365/brotli.git

然后进入edk2的目录,更新submodules,否则会影响后面BaseTools的编译。

$cd ekd2

$git submodule update –init

如果以后需要更新edk2,可以在edk2的目录下打开git bash,使用如下命令:

$git pull

$git submodule update

源码下载完成,可以准备搭建环境了。

3。编译BaseTools:

这个步骤比较简单,打开VS2015的Native命令行,进入edk2,执行:C:\UEFIWorkspace\edk2> edksetup.bat Rebuild

编译完成后,工作目录的结构如下:

图1 源码结构目录

4。编译UEFI程序:

在图1中,有一个名为“mybuild.bat”的批处理文件,这是为了以UEFIWorkspace为编译的工作目录而写的。在以前使用UDK2018的时候,edk2-libc下的三个包文件AppPkg、StdLib、StdLibPrivateInternalFiles,被直接放在了UDK2018的目录下,与其他的包放在一起。这样可以直接编译,不用设置库的寻找路径。但是,当使用edk2-platforms的时候,我实在不想把这个项目的所有文件也一起拷贝到edk2的目录中去,这会让整个edk2目录臃肿无比,也很不利于查找文件。所以,我写了mybuild.bat,用来保持现在这种简洁的目录结构。这个批处理文件的内容为:@REM 为保持比较清爽的目录而编写的,同时也方便编译新添加的各种包。

@REM Copyright (c) 2020-2030, Robin

@echo off

set WORKSPACE=%CD%

set EDK_TOOLS_PATH=%CD%\edk2\BaseTools

set CONF_PATH=%CD%\edk2\Conf

set PACKAGES_PATH=%CD%\edk2;%CD%\edk2-libc

@echo Set the Workspace.  -by robin 20200515

使用也比较简单,在执行edksetup.bat之前执行它就可以了。以编译AppPkg为例,命令如下(打开VS2015的编译命令行):

C:\UEFIWorkspace> mybuild.bat

C:\UEFIWorkspace> edk2\edksetup.bat

C:\UEFIWorkspace> build -p edk2-libc\AppPkg\AppPkg.dsc -t VS2015x86 -a IA32

所编译出的程序在C:\UEFIWorkspace\Build下。

5。新的特性:

最新的edk2中(当前我使用的是2020年3月份的版本),已经取消了NT32Pkg这个模拟器了,取而代之的是EmulatorPkg。让人高兴的是,新的模拟器终于提供了64位程序的支持了!再也不用为了测试64位的efi程序,还要特意打开VirtualBox或者Qemu来进行测试了。把执行文件拷贝到虚拟机的镜像里,是有点麻烦,有时甚至不如直接用实际的机器,用U盘拷贝文件去测试来得快。另外,这也意味着,应该可以直接使用Visual Studio自带的调试器,调试64位的代码了。EmulatorPkg的编译,之前在Linux下已经试过,编译命令如下:

C:\UEFIWorkspace> build -p edk2 \EmulatorPkg\EmulatorPkg.dsc -t VS2015x86 -a X64

编译出来的模拟器名称为WinHost.exe,位于Build\EmulatorX64\DEBUG_VS2015x86\X64下,双击运行即可。


四。启动模拟器:


1.执行命令:build run -t VS2013

使用qemu模拟器启动:编译OVMF版本的固件。


build -a X64 -p OvmfPkg\OvmfPkgX64.dsc -t VS2013 -b RELEASE



build -a X64 -p OvmfPkg\OvmfPkgX64.dsc -t VS2013 -D DEBUG_ON_SERIAL_PORT

2.安装qemu虚拟机,执行命令:

qemu-system-x86_64 -bios OVMF.fd -serial stdio