UEFI原理与实践笔记_开发环境搭建

UEFI原理与实践笔记(一)-开发环境搭建
记录一下在Windows环境下搭建UEFI开发环境的过程

配置Windows开发环境

下载安装所需工具

我们首先需要安装EDK2所依赖的开发工具及本身。

vs2019

安装 Visual Studio 2019 作为主要的开发工具
下载地址:https://visualstudio.microsoft.com/zh-hans/free-developer-offers/
我们勾选如下的选项即可:
安装
选用vs2019的原因是当前EDK2推荐的版本就是vs2019,比较稳定。
装好之后,我们可以将Developer Command Prompt for VS 2019这个快捷方式单独提出来,之后会频繁用到。

EDK2

Github地址:https://github.com/tianocore/edk2
最好下载最新的release版本,将EDK2目录解压后放在C:目录下。

Python 3.8

下载地址:https://www.python.org/ftp/python/3.8.1/python-3.8.1.exe
安装时最好勾选添加到环境变量中,不然之后还得自己配。

NASM

下载地址:https://www.nasm.us/
同样,将NASM安装到C:目录下,并将目录添加到系统环境变量Path中。

iasl

下载地址:https://acpica.org/downloads/binary-tools
将iasl安装到C:目录下,并将目录添加到系统环境变量Path中。

配置EDK2开发环境

初始化环境

进入EDK2目录,运行edksetup.bat,此步骤用于建立Conf目录下的target.txttools_def.txt等文件。

编辑编译相关文件

编辑Conf/target.txt

1
2
3
4
5
6
7
8
9
...
ACTIVE_PLATFORM = MdePkg/MdePkg.dsc
...
TARGET = RELEASE
...
TARGET_ARCH = X64
...
TOOL_CHAIN_TAG = VS2019
...

编译UEFI基础依赖包

首先我们需要设置命令行能够包含vs2019的工具集,我们打开之前强调的Developer Command Prompt for VS 2019,从该命令行窗口进入EDK2目录,即cd C:\edk2

在每一次编译项目前,我们还要保证EDK2环境变量被设置,即运行edksetup.bat

当我们设置完环境后,就可以执行build命令了,这个命令能够分析工程文件,根据你的设置自动执行相应编译和连接命令。在上面我们修改了target.txt文件,这个文件相当于编译配置文件。

在这里解释一下上面修改内容的含义:

  • MdePkg是UEFI环境下的基础库,地位差不多和C语言中的stdio.h类似,编译这个库后自己写的工程模块才能进行依赖运行。
  • 我们在这里编译的程序架构为X64,所以最后编译版本为Release,若为32位架构则可以选择编译版本为DEBUG,在这里不作讨论。
  • 工具链选择为vs2019

build命令执行后,若结果为Done,则说明环境配置成功。

编译CryptoPkg

补全CryptoPkg

在进行下个步骤之前,我们需要先编译CryptoPkg,我们打开edk2/CryptoPkg/Library/OpensslLib/openssl,发现是一个空的文件夹,我们需要下载OpenSSL的对应版本,先将CryptoPkg补全。

我们去EDK2 release找到自己下载的版本,在这里我们能找到对应所需的OpenSSL版本,我的EDK2版本是edk2-stable201911,对应的OpenSSL版本是1.1.1d。到OpenSSL官方下载:https://github.com/openssl/openssl/releases,解压并放到指定文件夹中。

编译

同上,编辑target.txt文件:

1
2
3
...
ACTIVE_PLATFORM = CryptoPkg/CryptoPkg.dsc
...

build命令执行后,若结果为Done,则说明编译成功。

安装并编译UEFI模拟器

安装QEMU虚拟机

下载地址:https://www.qemu.org/download/#windows

编译OVMF模拟器

引用一下官方对OVMF的介绍:

OVMF is an EDK II based project to enable UEFI support for Virtual Machines. OVMF contains sample UEFI firmware for QEMU and KVM.

简单来说,就是OVMF能够为虚拟机提供UEFI支持,能够为QEMU虚拟机提供UEFI固件样本。

在之前编译MdePkg时,我们需要修改target.txt文件,由于每次编译都得修改target.txt中的ACTIVE_PLATFORM选项过于麻烦,我们直接给build命令附加参数:

1
build -a X64 -p OvmfPkg/OvmfPkg.dsc

-p选项为通过指定.dsc文件指定要编译的Package,这个选项会取代target.txt中的ACTIVE_PLATFORM选项;-a选项选择目标平台,这个选项会取代target.txt中的TARGET_ARCH选项。

建立目录

若编译成功,我们能够在edk2/Build目录下见到我们先前编译的所有文件,
找到edk2/Build/OvmfX64/RELEASE_VS2019/FV/OVMF.fd文件,这就是我们需要的UEFI样本。

在任意地方新建一个目录,目录结构如下:

1
2
3
4
5
6
7
ovmf  名字可以自己起
|
│ OVMF.fd
│ run.bat
└───hda-contents
│ │ 这里将存放之后编译好的.efi文件
| | 文件夹的名称要和下面的 run.bat 脚本中的文件夹名称保持一致

其中,OVMF.fd就是编译好的文件,run.bat的内容如下:

1
qemu-system-x86_64 -drive file=OVMF.fd,if=pflash,format=raw,unit=0,readonly=on -drive file=fat:rw:.\hda-contents\,media=disk,if=virtio,format=raw -m 512 -machine q35,smm=on -nodefaults -vga std -global driver=cfi.pflash01,property=secure,value=on -global ICH9-LPC.disable_s3=1

此时我们执行run.bat,可以看到如下的界面:

UEFI模拟器启动界面

Shell >后输入fs0:即可进入到存放文件的位置,因为目前还没有任何工程,所以没有.efi可执行文件。

参考文献

UEFI原理与编程/戴正华著 2015.1

一杯咖啡