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.txt
,tools_def.txt
等文件。
编辑编译相关文件
编辑Conf/target.txt
1 | ... |
编译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 | ... |
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 | ovmf 名字可以自己起 |
其中,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
,可以看到如下的界面:
在Shell >
后输入fs0:
即可进入到存放文件的位置,因为目前还没有任何工程,所以没有.efi
可执行文件。
参考文献
UEFI原理与编程/戴正华著 2015.1