调试笔记-系列文章目录
调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件
文章目录
- 调试笔记-系列文章目录
- 调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件
- 前言
- 一、调试环境
- 操作系统:Windows 10 专业版
- 编译环境
- 调试目标
- 二、调试步骤
- 预置条件
- 安装 edk2 编译工具
- 打开 WSL 终端
- 从 apt 安装所需的软件
- 准备源代码
- 准备 edk2 的构建工具
- 开始编译 edk2 的 OVMF 固件
- 安装 nasm 2.16.03
- 继续编译 OVMF 固件
- 三、应用场景
- 在 Windows 环境中开发 UEFI 固件
- 四、参考资料
- 总结
前言
本文记录在 Windows 环境下在使用 WSL 运行 Ubuntu 20.04 Linux 发行版本编译测试 能在 QEMU 虚拟机中运行 OVMF 固件。
实验使用的电脑如下:
CPU:
Intel Core i5 8265U
操作系统:
Microsoft Windows 10 Professional (x64), Version 22H2, Build 19045.4412
一、调试环境
操作系统:Windows 10 专业版
操作系统详细信息如下:
Microsoft Windows 10 Professional (x64), Version 22H2, Build 19045.4412
编译环境
- Windows 系统开启 WSL 支持,安装 Ubuntu 20.04 发行版本
参考【安装笔记-20240520-Windows-自定义 WSL2 安装位置】
调试目标
能在 Windows / QEMU 8.2.2 软件上运行的 OVMF 固件。
说明:OVMF 固件是 edk2 项目针对 QEMU 虚拟机开发的 UEFI 固件,之前为了编译最新版本 edk2 提供的 OVMF,安装了纯 Windows 环境开发工具。
参考【调试笔记-20240516-Windows-使用VS2019编译edk2(上)】
但这样编译出来的 OVMF 固件无法在 QEMU 上正常启动。
因此,计划使用 QEMU 提供的编译脚本生成 OVMF 做测试。
但 QEMU 提供的编译脚本是基于 Linux 环境的 GCC 工具链编译的,所以决定安装 Linux 环境来编译验证。
二、调试步骤
预置条件
1、参考【安装笔记-20240520-Windows-自定义 WSL2 安装位置】准备好 Ubuntu 20.04 工作环境
2、下载 QEMU 8.2.2 源代码
下载链接:https://gitee.com/david921518/mingw-qemu
3、下载 edk2 源代码
下载链接:https://gitee.com/david921518/mingw-edk2
安装 edk2 编译工具
参考 How to build OVMF
以及 Using EDK II with Native GCC
打开 WSL 终端
- 在 Windows 终端中输入命令
wsl
- 进入 WLS 终端
从 apt 安装所需的软件
sudo apt-get update
sudo apt install build-essential uuid-dev iasl git nasm python-is-python3
准备源代码
- 下载 QEMU 源代码,执行以下命令:
git clone -b stable-8.2 git@gitee.com:david921518/mingw-qemu.git
- 进入 QEMU 源代码目录的 /roms 子目录中,下载 edk2 源码,执行以下命令:
cd mingw-qemu
cd roms
git clone git@gitee.com:david921518/mingw-edk2.git edk2
- 下载 edk2 需要的子模块,执行以下命令:
cd edk2
git submodule update --init
准备 edk2 的构建工具
- 在 /edk2 目录下执行以下命令:
make -C BaseTools
. edksetup.sh
开始编译 edk2 的 OVMF 固件
- QEMU 源码 /roms/ 目录中创建环境文件 edk2_ubuntu2004_env.sh,内容如下:
#!/bin/bash
export PYTHON=python3
export MAKE=make
export NASM_PREFIX=/usr/bin/
export IASL_PREFIX=/usr/bin/
export EDK_TOOLS_PATH=$PWD/edk2/BaseTools
- 回到 QEMU 源码 /roms/ 目录开始构建 OVMF 固件,执行以下命令:
cd ..
. edk2_ubuntu2004_env.sh
make efi
编译过程中出现以下错误:
/home/yuhui/gitee/mingw-qemu/roms/Build/OvmfIa32/DEBUG_GCC5/IA32/MdePkg/Library/BaseLib/BaseLib/OUTPUT/Ia32/LongJump.iii:42: error: parser: instruction expected
/home/yuhui/gitee/mingw-qemu/roms/Build/OvmfIa32/DEBUG_GCC5/IA32/MdePkg/Library/BaseLib/BaseLib/OUTPUT/Ia32/LongJump.iii:47: error: parser: instruction expected
make[1]: *** [GNUmakefile:856: /home/yuhui/gitee/mingw-qemu/roms/Build/OvmfIa32/DEBUG_GCC5/IA32/MdePkg/Library/BaseLib/BaseLib/OUTPUT/Ia32/LongJump.obj] Error 1
make[1]: Leaving directory '/home/yuhui/gitee/mingw-qemu/roms/Build/OvmfIa32/DEBUG_GCC5/IA32/MdePkg/Library/BaseLib/BaseLib'
build.py...
: error 7000: Failed to execute command
make tbuild [/home/yuhui/gitee/mingw-qemu/roms/Build/OvmfIa32/DEBUG_GCC5/IA32/MdePkg/Library/BaseLib/BaseLib]
build.py...
: error F002: Failed to build module
/home/yuhui/gitee/mingw-qemu/roms/edk2/MdePkg/Library/BaseLib/BaseLib.inf [IA32, GCC5, DEBUG]
- Failed -
检查发现是 nasm 版本太低的问题:
yuhui@DESKTOP-G7VL639:~/gitee/mingw-qemu/roms$ nasm --version
NASM version 2.14.02
当前代码要求 nasm version 2.15.05 以上
NASM 2.15.05 is the recommended minimum version.
安装 nasm 2.16.03
当前最新版本 nasm 为 2.16.03,下载编译并安装到 /usr/bin 目录中。
新开 WSL 终端窗口,在用户根目录执行以下命令:
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.bz2
tar -jvxf nasm-2.16.03.tar.bz2
cd nasm-2.16.03
配置 nasm 编译条件
./autogen.sh
./configure --prefix=/usr
编译 nasm
make
安装到系统目录 /usr/bin 下
sudo make install
验证 nasm 版本已是最新版本
继续编译 OVMF 固件
切回到编译 OVMF 的 WSL 终端窗口,继续执行命令:
make efi
在编译 ARM 体系的 UEFI 固件时出错,此处可以跳过,我们只关心 IA32 和 X64 的 UEFI 固件。
在各个编译目标的 /FV 目录中成功生成了 OVMF.fd 文件。
三、应用场景
在 Windows 环境中开发 UEFI 固件
将上一步生成的 OVMF.fd 文件复制到 QEMU 工作目录,执行以下命令:
qemu-system-x86_64 -bios "data\ovmf.fd" -debugcon file:debug.log -global isa-debugcon.iobase=0x402
QEMU 成功启动并进入 EFI 模式。
四、参考资料
1、How to build OVMF
2、Using EDK II with Native GCC
总结
本文介绍了在 Windows WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件的步骤,并指出过程中遇到的问题及解决方法。