【调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件】

调试笔记-系列文章目录

调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件


文章目录

  • 调试笔记-系列文章目录
    • [调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件](#调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件)
  • 前言
  • 一、调试环境
  • 二、调试步骤
    • 预置条件
    • [安装 edk2 编译工具](#安装 edk2 编译工具)
      • [打开 WSL 终端](#打开 WSL 终端)
      • [从 apt 安装所需的软件](#从 apt 安装所需的软件)
    • 准备源代码
    • [准备 edk2 的构建工具](#准备 edk2 的构建工具)
    • [开始编译 edk2 的 OVMF 固件](#开始编译 edk2 的 OVMF 固件)
      • [安装 nasm 2.16.03](#安装 nasm 2.16.03)
      • [继续编译 OVMF 固件](#继续编译 OVMF 固件)
  • 三、应用场景
    • [在 Windows 环境中开发 UEFI 固件](#在 Windows 环境中开发 UEFI 固件)
  • 四、参考资料
  • 总结

前言

本文记录在 Windows 环境下在使用 WSL 运行 Ubuntu 20.04 Linux 发行版本编译测试 能在 QEMU 虚拟机中运行 OVMF 固件。

实验使用的电脑如下:

CPU:

shell 复制代码
Intel Core i5 8265U

操作系统:

shell 复制代码
Microsoft Windows 10  Professional (x64), Version 22H2, Build 19045.4412

一、调试环境


操作系统:Windows 10 专业版

操作系统详细信息如下:

shell 复制代码
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 终端中输入命令
powershell 复制代码
wsl
  • 进入 WLS 终端

从 apt 安装所需的软件

bash 复制代码
sudo apt-get update

sudo apt install build-essential uuid-dev iasl git  nasm  python-is-python3

准备源代码

  • 下载 QEMU 源代码,执行以下命令:
bash 复制代码
git clone -b stable-8.2 git@gitee.com:david921518/mingw-qemu.git
  • 进入 QEMU 源代码目录的 /roms 子目录中,下载 edk2 源码,执行以下命令:
bash 复制代码
cd mingw-qemu

cd roms

git clone git@gitee.com:david921518/mingw-edk2.git edk2
  • 下载 edk2 需要的子模块,执行以下命令:
bash 复制代码
cd edk2

git submodule update --init

准备 edk2 的构建工具

  • 在 /edk2 目录下执行以下命令:
bash 复制代码
make -C BaseTools
. edksetup.sh

开始编译 edk2 的 OVMF 固件

  • QEMU 源码 /roms/ 目录中创建环境文件 edk2_ubuntu2004_env.sh,内容如下:
bash 复制代码
#!/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 固件,执行以下命令:
bash 复制代码
cd ..
. edk2_ubuntu2004_env.sh
make efi

编译过程中出现以下错误:

bash 复制代码
/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 版本太低的问题:

bash 复制代码
yuhui@DESKTOP-G7VL639:~/gitee/mingw-qemu/roms$ nasm --version
NASM version 2.14.02

当前代码要求 nasm version 2.15.05 以上

bash 复制代码
NASM 2.15.05 is the recommended minimum version.

安装 nasm 2.16.03

当前最新版本 nasm 为 2.16.03,下载编译并安装到 /usr/bin 目录中。

新开 WSL 终端窗口,在用户根目录执行以下命令:

bash 复制代码
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 编译条件

bash 复制代码
./autogen.sh
./configure --prefix=/usr

编译 nasm

bash 复制代码
make

安装到系统目录 /usr/bin 下

bash 复制代码
sudo make install

验证 nasm 版本已是最新版本

继续编译 OVMF 固件

切回到编译 OVMF 的 WSL 终端窗口,继续执行命令:

bash 复制代码
make efi

在编译 ARM 体系的 UEFI 固件时出错,此处可以跳过,我们只关心 IA32 和 X64 的 UEFI 固件。

在各个编译目标的 /FV 目录中成功生成了 OVMF.fd 文件。


三、应用场景

在 Windows 环境中开发 UEFI 固件

将上一步生成的 OVMF.fd 文件复制到 QEMU 工作目录,执行以下命令:

bash 复制代码
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 固件的步骤,并指出过程中遇到的问题及解决方法。

相关推荐
DevinLGT23 分钟前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
MarcoAI1 小时前
github SSH连接(windows)
windows·ssh·github
朱容君1 小时前
Linux系统编程多线程之读写锁讲解
linux·开发语言
大风吹PP凉1 小时前
38配置管理工具(如Ansible、Puppet、Chef)
linux·运维·服务器·ansible·puppet
小A1591 小时前
STM32完全学习——系统时钟设置
stm32·嵌入式硬件·学习
康熙38bdc1 小时前
Linux 进程间通信——共享内存
linux·运维·服务器
jwybobo20071 小时前
redis7.x源码分析:(3) dict字典
linux·redis
scoone2 小时前
ssh登陆服务器后支持Tab键命令补全
linux·shell
金星娃儿2 小时前
MATLAB基础知识笔记——(矩阵的运算)
笔记·matlab·矩阵
运维佬3 小时前
CentOS 9 配置网卡
linux·centos