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

相关推荐
龙仔72511 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
韭菜炒鸡肝天12 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
我不管我就要叫小猪12 小时前
嵌入式Linux----网络通信
linux·运维·服务器
泡沫冰@12 小时前
ECS 的介绍和使用
linux·服务器·网络
笨鸟先飞,勤能补拙12 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
姜太小白13 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php
fengyehongWorld13 小时前
Linux 终端快捷键
linux·运维
我上去就是一套QWER然后等待复活13 小时前
Windows 清理 CC Switch 并恢复官方 Codex CLI 登录流程(完整记录)
windows
吾儿良辰14 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
哎呦喂我去去去14 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#