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

相关推荐
小莞尔6 分钟前
【51单片机】【protues仿真】基于51单片机宠物投食器系统
c语言·stm32·单片机·嵌入式硬件·51单片机·proteus
逼子格10 分钟前
【Protues仿真】基于AT89C52单片机的数码管驱动事例
单片机·嵌入式硬件·硬件工程·硬件工程师·protues·数码管·电路仿真
btyzadt27 分钟前
虚拟机蓝屏问题排查与解决
linux·运维·网络
咸甜适中36 分钟前
rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十四)垂直滚动条
笔记·学习·rust·egui
風清掦43 分钟前
零基础玩转STM32:深入理解ARM Cortex-M内核与寄存器编程
stm32·单片机·嵌入式硬件·mcu·物联网
努力敲代码的小盆友1 小时前
[自用笔记]上传本地项目至github
笔记·github
G_H_S_3_1 小时前
【网络运维】Shell 脚本编程:while 循环与 until 循环
linux·运维·网络·shell
coderklaus2 小时前
Shell 基础知识
linux·macos·shell
争不过朝夕,又念着往昔2 小时前
即时通讯项目---网关服务
linux·c++·vscode
It_张2 小时前
Building Systems with the ChatGPT API 使用 ChatGPT API 搭建系统(第五章学习笔记及总结)
笔记·学习·chatgpt