【调试笔记-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 固件的步骤,并指出过程中遇到的问题及解决方法。

相关推荐
ybb7046306 小时前
linux第二次作业
linux·运维·服务器
ouliten7 小时前
cuda编程笔记(33)--Thrust库的使用
笔记·cuda
大白同学4217 小时前
【Linux】进程间通信
linux·运维·服务器
摇滚侠12 小时前
Spring Boot 3零基础教程,新特性 ProblemDetails,笔记50
spring boot·笔记
一只一只12 小时前
Unity 3D笔记(进阶部分)——《B站阿发你好》
笔记·3d·unity·游戏引擎
月临水12 小时前
Git 学习笔记
笔记·git·学习·1024程序员节
Felven13 小时前
统信系统下设置RTC时间
linux·rtc·1024程序员节
fruge14 小时前
Vue Pinia 状态管理实战指南
前端·vue.js·ubuntu
朝新_14 小时前
【SpringBoot】详解Maven的操作与配置
java·spring boot·笔记·后端·spring·maven·javaee
盛世隐者14 小时前
【Linux】定制Linux系统
linux·运维·服务器