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

news2024/11/20 22:39:48

调试笔记-系列文章目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

作业-day-240523

思维导图 知识点问答 1、IO多路复用的原理 1、创建一个检测文件描述符的容器 fd_set fds; 2、将需要检测的文件描述符放入容器中 FD_SET(文件描述符,&fds); 3、通过一个阻塞函数阻塞等待容器中是否有事件产生,如果有一个或多个事件产生&#xff0c…

C++设计模式|结构型 适配器模式

1.什么是适配器模式? 可以将⼀个类的接⼝转换成客户希望的另⼀个接⼝,主要⽬的是 充当两个不同接⼝之间的桥梁,使得原本接⼝不兼容的类能够⼀起⼯作。 2. 适配器模式的组成 (1)接口类,给客户端调用&…

软件设计师-上午题-计算题汇总

一、存储系统 - 存储容量计算(字节编址、位编址、芯片个数) 内存地址是16进制 内存地址编址的单位是Byte,1K1024B 1B 8 bit 1.计算存储单元个数 存储单元个数 末地址 - 首地址 1 eg. 按字节编址,地址从 A4000H 到 CBFFFH&…

汽车IVI中控开发入门及进阶(十八):显示技术之Frame Buffer帧缓冲器

Frame Buffer帧缓冲器(帧缓冲器,有时是帧存储器)是随机存取存储器(RAM)的一部分,包含驱动视频显示器的位图。它是一个内存缓冲区,包含表示完整视频帧中所有像素的数据。现代视频卡的核心包含帧缓冲电路。该电路将内存中的位图转换为可以在计算机监视器上显示的视频信号。…

Redis未授权访问漏洞复现 CNVD-2019-21763 CNVD-2015-07557

CNVD-2019-21763 漏洞描述 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 由于在Reids 4.x及以上版本中新增了模块功能,攻击者可通过外部拓展,在Redis中实现一个新…

redis集群不允许操作多个key解决方案、redis key负载均衡方案

前提 在cluster redis 中进行同一个命令处理不同的key会报错:CROSSSLOT Keys in request dont hash to the same slot,例如: 此示例使用sdiff 命令对pool_1与pool_2进行diff操作。 那么我们在业务场景中就需要将集群redis中的不同key进行操作,我们该如何处理呢? 本次的…

多线程(八)

一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…

探秘QT 5软件开发:从零到实战的旅程

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、QT 5软件开发的启航 二、GUI框架比较与QT 5的选择 三、QT 5环境搭建与软件设计实战 四…

GPT-SoVITS语音克隆部署与使用

GPT-SoVITS是一款强大的少量样本语音转换与语音合成开源工具。当前,GPT-SoVITS实现了如下几个方面的功能: 由参考音频的情感、音色、语速控制合成音频的情感、音色、语速可以少量语音微调训练,也可不训练直接推理可以跨语种生成,…

Python魔法学院:PySpider篇——网络世界的探险与征服

Hi,我是阿佑,迎来到Python魔法学院,今天阿佑要带大家学习的是PySpider篇——一门让你在网络世界中探险与征服的魔法课程。从环境搭建到高级功能应用,再到性能优化,每一个章节都是成为数据大师的必经之路! 文…

Ceph集群RBD块存储:快照与Copy-on-Write克隆的基本操作

文章目录 1.RBD块存储镜像克隆概念2.copy-on-write克隆的基本使用2.1.在块存储中创建一个快照2.2.将快照配置成保护模式2.3.基于快照克隆出镜像2.4.使用克隆的镜像2.5.查看一个快照下有哪些克隆的镜像 1.RBD块存储镜像克隆概念 镜像克隆官方文档:https://docs.ceph…

巨控无线通讯模块在煤化工皮带保护系统中的应用

一、项目介绍 近年来由于煤矿化工行业在实际生产过程中事故频发,国家安监部门自2022年起开展了为其三年的专项整治行动,皮带运输系统作为煤矿化工行业自动化系统的重要组成部分成为此次专项整治重点。 兖矿新疆能化有限公司作为山能集团在新疆分部的龙…

NoSQL Redis配置与优化

一、关系数据库与非关系型数据库 1. 关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型…

Redis三主三从集群搭建(docker版)

文章目录 1.分布式存储算法1.哈希取余算法2.一致性哈希算法1.基本介绍2.优点1.容错性2.扩展性 3.缺点:数据倾斜问题 3.哈希槽分区(大厂常用) 2.基础环境搭建1.给六台机器都安装docker1.卸载旧版本的docker2.安装 gcc相关3.安装yum-utils软件包…

电脑连接爱快iKuai软路由之后,网卡没有正常获取到IP,无法访问爱快路由管理页?

前言 上一次咱们说到在爱快控制台上设置/辨认lan口,设置完成之后,其他的一些设置就需要在爱快iKuai软路由的管理页面上设置。 有些小伙伴会发现,当电脑连接上爱快软路由的lan口之后,电脑并没有正常获取到ip,导致无法访…

从零开始运行BERT的详细教程,使用MRPC数据集进行测试

1、安装anaconda环境 镜像网址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、配置环境变量 3、创建虚拟环境 #常用命令 #创建 conda create -n xxx python3.8 #激活 conda activate xxx #删除 conda remove -n xxx --all #查看 con…

汀木云OZON选品工具,OZON跨境电商的选品利器

在竞争激烈的跨境电商市场中,选品是卖家们成功经营的关键之一。而汀木云OZON选品工具,作为OZON跨境电商的选品利器,以其独特的优势,为卖家们提供了精准、高效的选品解决方案。接下来看看汀木云OZON选品工具和萌啦OZON数据跨境OZON…

客户端Web资源缓存

为了提高Web服务器的性能,其中的一种可以提高Web服务器性能的方法就是采用缓存技术。 1.缓存 1.1.什么是缓存? 如果某个资源的计算耗时或耗资源,则执行一次并存储结果。当有人随后请求该资源时,返回存储的结果,而不是再次计算。…

以太坊(3)——智能合约

智能合约 首先明确一下几个说法(说法不严谨,为了介绍清晰才说的): 全节点矿工 节点账户 智能合约是基于Solidity语言编写的 学习Solidity语言可以到WFT学院官网(Hello from WTF Academy | WTF Academy)…

2024电工杯数学建模选题建议及各题思路来啦!

大家好呀,2024电工杯数学建模竞赛开始了,来说一下初步的选题建议吧: 首先定下主基调, 本次电工杯建议选B。A题目难度较高,只建议有相关专业知识和优化经验的队伍选择,小白队伍无脑选B即可。是比较经典的数…