wsl2配置xv6全解(包括22.04Jammy)

文章目录

  • 获取xv6源代码
  • Ubuntu
    • 20.04 Version
      • 安装指令
      • 成功测试
      • 参考MIT2021年官方文档
    • 24.04 Version
      • 安装指令
      • 成功测试
      • 参考MIT2024年官方文档
  • Ubuntu 22.04
      • 没有官方文档?
    • 配置大体流程
      • 1. 卸载原本qemu(如果之前安装了)
      • 2. clone qemu官方源代码,切换到stable 7.2 version
      • 3. configure
      • 4. make 并 install
      • 5. 删除下载的qemu项目
  • 心酸历程
    • 能不能用24.04的Qemu?
  • 更多
    • 三种riscv-gcc的应用场景与区别
      • 能不能在wsl下使用?
        • riscv64-linux-gnu-gcc
        • riscv64-unknown-elf-gcc
        • riscv64-unknown-linux-gnu-gcc
    • 配置环境项讲解
      • 1. git
      • 2. build-essential
      • 3. gdb-multiarch
      • 4. qemu-system-misc
      • 5. gcc-riscv64-linux-gnu
      • 6. binutils-riscv64-linux-gnu
      • 总结
    • 自己安装的qemu和apt安装的有什么区别
      • 1. 版本差异
      • 2. 编译选项
      • 3. 安装路径
      • 4. 依赖管理
      • 5. 更新与维护
      • 6. 兼容性

获取xv6源代码

git clone https://github.com/mit-pdos/xv6-riscv.git
cd xv6-riscv #视下载后项目文件而定,可能在更多层中

下载好并正确进入OS源代码所在文件夹后,结构应该为

请添加图片描述

Ubuntu

20.04 Version

最终环境:QEMU 5.1+, GDB 8.3+, GCC, and Binutils.

安装指令

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

成功测试

# in the xv6 directory
$ make qemu
# ... lots of output ... 最终显示
init: starting sh
$

如果没有成功,可以检查下面环境

$ qemu-system-riscv64 --version
QEMU emulator version 5.1.0

至少一个以下GCC版本

$ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (Debian 10.3.0-8) 10.3.0
...
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (GCC) 10.1.0
...
$ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (GCC) 10.1.0
...

参考MIT2021年官方文档

6.S081 / Fall 2021

24.04 Version

最终环境:RISC-V versions of QEMU 7.2+, GDB 8.3+, GCC, and Binutils.

安装指令

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

成功测试

# in the xv6 directory
$ make qemu
# ... lots of output ...
init: starting sh
$

如果没有成功,可以检查下面环境

$ qemu-system-riscv64 --version
QEMU emulator version 7.2.0

至少一个以下GCC版本

$ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (Debian 10.3.0-8) 10.3.0
...
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (GCC) 10.1.0
...
$ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (GCC) 10.1.0
...

参考MIT2024年官方文档

6.1810 / Fall 2024

Ubuntu 22.04

有人又要说了,博主博主这不是CV官方文档吗。这也可以水一篇博客,强烈谴责!

也有人就要问了,主播主播,20.04和24.04版本的配置环境太没有含金量了,有没有什么又没有什么博客指引,也没有官方文档的版本?

有的,兄弟,有的。像这样的牢版本还有2(jiǔ)个……其中一个便是咱们的22.04,高贵的Jammy玩家

没有官方文档?

20年没有wsl版本,21~23年是20.04的天下,24年终于更新了……是24.04(Jammy玩家悬着的心还是死了)

不过以下指令还是要先执行的

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch binutils-riscv64-linux-gnu

配置大体流程

  1. 卸载原先qemu
  2. clone qemu官方源代码,切换到stable 7.2 version
  3. configure
  4. make 并 install

1. 卸载原本qemu(如果之前安装了)

22.04版本使用 apt install 直接安装的版本是 6.2.0
请添加图片描述

由于不知名原因,这个qemu并无法直接使用。会出现执行 make qemu 到一半卡住无反馈的情况

请添加图片描述

我当时还寻思着怎么启动个系统这么久……

此时有两个选择,一是使用老版本qemu(5.1),二是使用新版本qemu(7.2)。由于官方已更新,所以我们选择后者。

使用apt移除qemu

sudo apt remove --purge qemu qemu-system qemu-utils qemu-system-* -y

清理残留文件

sudo apt autoremove -y
sudo apt autoclean

检查是否仍然存在 QEMU

qemu-system-riscv64 --version

如果命令返回 “command not found”,说明 QEMU 已成功卸载。

2. clone qemu官方源代码,切换到stable 7.2 version

git clone https://gitlab.com/qemu-project/qemu.git
cd ./qemu
git checkout stable-7.2

注意:这里没有用到最新版(学都是学最新的,用都是用最老的~~~)

3. configure

cd qemu/
mkdir build
cd build/
../configure --target-list=x86_64-softmmu,riscv64-softmmu --enable-debug

注意这里我们只make了x86_64和riscv-64版本并且之后安装到/usr/local下。此时调用项目中可执行文件configure为make作准备。

出现 ERROR: Cannot find Ninja

执行命令

sudo apt install ninja-build

出现 ERROR: glib-2.56 gthread-2.0 is required to compile QEMU

执行命令

sudo apt install libglib2.0-dev

之后想要将qemu安装到/usr而非/usr/local下(不推荐,可能会和系统自带包管理器相冲突)

将原本configure指令替换为

../configure --target-list=x86_64-softmmu,riscv64-softmmu --enable-debug --prefix=/usr

成功configure之后显示
请添加图片描述
后面还有很多参数,没有截全

4. make 并 install

make -j$(nproc)
sudo make install

make过程可能会持续几分钟,因机而异

完成后尝试

qemu-system-riscv64 --version

如果正常输出则ok,如果没有找到则需要将 /usr/local 也添加到 PATH

尝试

 export PATH=/usr/local/bin:$PATHqemu-system-riscv64 --version

如果正常输出则将该路径添加到配置文件的PATH中

echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

如果,不出意外的话。此时回到 xv6-riscv 目录便可以执行 make qemu
请添加图片描述

5. 删除下载的qemu项目

如果之后不打算make其他架构的硬件模拟,此时便可以把下载的qemu源代码文件夹删除了

sudo rm -rf ./qemu

心酸历程

能不能用24.04的Qemu?

你可真是个小天才,借腹生子是吧!!!

警告:以下命令不要随便执行

sudo add-apt-repository ppa:jacob/virtualisation -y
sudo apt update
sudo apt install qemu-system-riscv64 -y

运行之后再去试试 make qemu ,结果能执行了!!!然后发现你的 gdb 就神奇的不见了……
请添加图片描述

原因就是你安装高版本的 qemu-system 时安装了覆盖一些依赖,此时便将冲突的gdb给卸载了。仔细检查 sudo apt install qemu-system-riscv64 -y 的输出日志可以发现信息

The following packages will be REMOVED:debhelper debugedit gdb gdb-multiarch ...

sad~~~天地好轮回,苍天饶过谁

这个教训告诉我们,以后在看到有哪篇博客里存在指令 apt *** -y-y 结尾,基本可以拖出去斩了(bushi)

后面就因为这个事情导致22.04版本的一些依赖变成了24.04,这个做法实在是个烂主意!

请添加图片描述

原以为22.04玩家已经是最牢的,没想到b站上还有更牢的18.04玩家(bushi)

立创泰山派训练营学习笔记–Ubuntu22.04.4 rootfs根文件系统制作-Linux SDK编译(二)

更多

三种riscv-gcc的应用场景与区别

编译器适用场景目标架构典型应用是否支持标准 C 库
riscv64-linux-gnu-gccLinux 用户空间riscv64-linux-gnu编译 RISC-V Linux 应用程序✅ (glibc)
riscv64-unknown-elf-gcc裸机 / RTOS / OS 内核riscv64-unknown-elf编译 xv6、U-Boot、裸机程序❌(无操作系统支持)
riscv64-unknown-linux-gnu-gccLinux 用户空间riscv64-unknown-linux-gnu交叉编译 Linux 程序(可能使用 musl)✅ (glibcmusl)
  • 如果你在开发 Linux 用户空间应用(如普通软件)
    → 用 riscv64-linux-gnu-gccriscv64-unknown-linux-gnu-gcc
  • 如果你在开发 RISC-V 操作系统或裸机程序(如 Bootloader、xv6
    → 用 riscv64-unknown-elf-gcc
  • 如果你不确定,但目标是在 RISC-V Linux 运行
    → 用 riscv64-linux-gnu-gcc

能不能在wsl下使用?

riscv64-linux-gnu-gcc

请添加图片描述

情况:可以编译成功但是无法执行

这个gcc最终编译的二进制文件针对的是RISCV架构,所以无法在一般的x86-64架构上直接执行。而xv6-riscv是通过qemu模拟riscv硬件才能够执行

riscv64-unknown-elf-gcc

请添加图片描述

情况:连编译都编译不过去了

riscv64-unknown-elf-gcc 针对的是裸机环境,那么包没有 <stdoi.h> 的。所以确实无法编译

riscv64-unknown-linux-gnu-gcc

没下……

配置环境项讲解

MIT的 apt-get install 命令安装了以下几个关键的软件包,主要用于在 WSL2 的 Ubuntu 22.04 上配置 xv6(一个 RISC-V 架构的类 Unix 操作系统)的开发和调试环境。


1. git

  • 作用:Git 版本控制系统,用于下载 xv6 源码,并进行代码管理(如克隆、提交和更新)。
  • xv6 相关性:从 GitHub 上克隆 xv6 源代码,例如:
    git clone https://github.com/mit-pdos/xv6-riscv.git
    

2. build-essential

  • 作用:提供了一组基本的编译工具,包括 gccg++make 等。
  • xv6 相关性
    • xv6 使用 make 进行编译,依赖 gcc 进行 C 语言编译。
    • build-essential 里包含 make,而 xv6 的 Makefile 需要 make 来组织编译流程。

3. gdb-multiarch

  • 作用:支持多架构的 GNU 调试器(GDB),可用于调试不同 CPU 指令集(如 x86、ARM、RISC-V 等)的程序。
  • xv6 相关性
    • xv6 运行在 RISC-V 上,因此需要一个支持 RISC-V 的 GDB 进行调试。
    • 可以用它远程调试 QEMU 模拟器运行的 xv6:
      gdb-multiarch
      (gdb) target remote localhost:1234
      

4. qemu-system-misc

  • 作用:QEMU 是一个通用的CPU 模拟器,qemu-system-misc 包含对多个架构的 QEMU 模拟支持。
  • xv6 相关性
    • xv6 需要 QEMU 来模拟 RISC-V 硬件环境
    • 通常用如下命令运行 xv6:
      make qemu
      

5. gcc-riscv64-linux-gnu

  • 作用:RISC-V 交叉编译器,可以编译 RISC-V 目标平台的代码
  • xv6 相关性
    • xv6 运行在 RISC-V 上,而你的开发环境是 x86_64,因此需要交叉编译器编译 RISC-V 代码。
    • 可以用它手动编译 xv6 代码:
      riscv64-linux-gnu-gcc -o hello hello.c
      

6. binutils-riscv64-linux-gnu

  • 作用:RISC-V 目标平台的 GNU binutils 工具集,包括 as(汇编器)、ld(链接器)等。
  • xv6 相关性
    • xv6 需要 as 来编译汇编代码。
    • ld 用于链接最终的 xv6 可执行文件。

总结

软件包作用在 xv6 中的用途
git版本控制克隆 xv6 源码
build-essentialC/C++ 编译工具编译 xv6
gdb-multiarch多架构调试调试 xv6
qemu-system-miscCPU 模拟器运行 xv6
gcc-riscv64-linux-gnu交叉编译编译 RISC-V 代码
binutils-riscv64-linux-gnu汇编/链接工具处理 RISC-V 汇编和链接

自己安装的qemu和apt安装的有什么区别

1. 版本差异

apt 安装:Ubuntu 官方软件源提供的 QEMU 可能是稳定版,但版本较老/或太新,可能缺少一些新功能或优化。
自己编译:可以选择最新的源码,获取最新功能、修复的 bug 和性能优化。

2. 编译选项

apt 安装:使用的是 Ubuntu 维护者编译的二进制文件,默认开启了一些常见的功能,但可能未启用所有选项。
自己编译:可以根据需求启用或禁用特定功能,例如:

  • 仅编译支持特定架构(如 --target-list=riscv64-softmmu
  • 选择特定的加速选项(如 --enable-kvm--enable-tcg
  • 进行特定优化(如 --enable-lto 进行链接时优化)

3. 安装路径

apt 安装:QEMU 会被安装到系统路径(如 /usr/bin/qemu-system-*
自己编译
默认安装在 ·/usr/local/bin·,不会影响系统自带的 QEMU
可以自定义安装路径(如 ./configure --prefix=/opt/qemu
安装路径在 configure 之后的报告里有,如果保存了源代码build文件夹还可以执行 sudo make uninstall 进行卸载

4. 依赖管理

apt 安装:自动处理依赖关系,安装/卸载时不容易出问题。
自己编译:需要手动安装依赖(如 libglib2.0-dev、libpixman-1-dev),可能会遇到缺少库或不兼容的问题。

5. 更新与维护

apt 安装:系统更新时可以自动升级(sudo apt upgrade)。
自己编译:需要手动拉取源码并重新编译安装,维护成本更高。

6. 兼容性

apt 安装:官方软件源提供的版本经过测试,与 Ubuntu 其他软件兼容性较好。
自己编译:如果使用了非官方补丁或特定配置,可能会遇到不兼容问题,例如影响 gdb、libvirt、kvm 相关组件的使用。

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

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

相关文章

招聘面试季--一文顿悟,Java中字节流和字符流的区别及使用场景上的差异

‌一、核心区别‌ ‌特性‌‌字节流‌‌字符流‌‌数据单位‌以字节&#xff08;8-bit&#xff09;为单位处理数据&#xff08;如0xA1&#xff09;以字符&#xff08;16-bit Unicode&#xff09;为单位处理数据&#xff08;如A, 你&#xff09;‌基类‌InputStream / OutputSt…

车载以太网网络测试-16【传输层-UDP】

目录 1 摘要2 车载以太网传输层概述3 车载以太网UDP协议3.1 车载以太网UDP协议的作用3.2 UDP报文帧结构3.3 UDP协议的通信过程3.3.1 通信过程3.3.2 实例示例3.3.3 代码示例 4 总结 1 摘要 车载以太网的第五层是传输层&#xff0c;它在车载网络架构中扮演着至关重要的角色。主要…

深度强化学习中的深度神经网络优化策略:挑战与解决方案

I. 引言 深度强化学习&#xff08;Deep Reinforcement Learning&#xff0c;DRL&#xff09;结合了强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;和深度学习&#xff08;Deep Learning&#xff09;的优点&#xff0c;使得智能体能够在复杂的环境中学…

无人机点对点技术要点分析!

一、技术架构 1. 网络拓扑 Ad-hoc网络&#xff1a;无人机动态组建自组织网络&#xff0c;节点自主协商路由&#xff0c;无需依赖地面基站。 混合架构&#xff1a;部分场景结合中心节点&#xff08;如指挥站&#xff09;与P2P网络&#xff0c;兼顾集中调度与分布式协同。 2.…

MQ,RabbitMQ,MQ的好处,RabbitMQ的原理和核心组件,工作模式

1.MQ MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中 保存消息的容器。它是应用程序和应用程序之间的通信方法 1.1 为什么使用MQ 在项目中&#xff0c;可将一些无需即时返回且耗时的操作提取出来&#xff0c;进行异步处理&#xff0…

django怎么配置404和500

在 Django 中&#xff0c;配置 404 和 500 错误页面需要以下步骤&#xff1a; 1. 创建自定义错误页面模板 首先&#xff0c;创建两个模板文件&#xff0c;分别用于 404 和 500 错误页面。假设你的模板目录是 templates/。 404 页面模板 创建文件 templates/404.html&#x…

各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写

上一篇下一篇RNN&#xff08;中集&#xff09;待编写 代码详解 pytorch 官网主要有两个可调用的模块&#xff0c;分别是 nn.RNNCell 和 nn.RNN &#xff0c;下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的&#xff0c;只需要将对输入…

深度学习篇---深度学习中的范数

文章目录 前言一、向量范数1.L0范数1.1定义1.2计算式1.3特点1.4应用场景1.4.1特征选择1.4.2压缩感知 2.L1范数&#xff08;曼哈顿范数&#xff09;2.1定义2.2计算式2.3特点2.4应用场景2.4.1L1正则化2.4.2鲁棒回归 3.L2范数&#xff08;欧几里得范数&#xff09;3.1定义3.2特点3…

星越L_灯光操作使用讲解

目录 1.开启前照灯 2左右转向灯、远近灯 3.auto自动灯光 4.自适应远近灯光 5.后雾灯 6.调节大灯高度 1.开启前照灯 2左右转向灯、远近灯 3.auto自动灯光 系统根据光线自动开启灯光

Stable Diffusion lora训练(一)

一、不同维度的LoRA训练步数建议 2D风格训练 数据规模&#xff1a;建议20-50张高质量图片&#xff08;分辨率≥10241024&#xff09;&#xff0c;覆盖多角度、多表情的平面风格。步数范围&#xff1a;总步数控制在1000-2000步&#xff0c;公式为 总步数 Repeat Image Epoch …

AI 生成 PPT 网站介绍与优缺点分析

随着人工智能技术不断发展&#xff0c;利用 AI 自动生成 PPT 已成为提高演示文稿制作效率的热门方式。本文将介绍几款主流的 AI PPT 工具&#xff0c;重点列出免费使用机会较多的网站&#xff0c;并对各平台的优缺点进行详细分析&#xff0c;帮助用户根据自身需求选择合适的工具…

使用Systemd管理ES服务进程

Centos中的Systemd介绍 CentOS 中的 Systemd 详细介绍 Systemd 是 Linux 系统的初始化系统和服务管理器&#xff0c;自 CentOS 7 起取代了传统的 SysVinit&#xff0c;成为默认的初始化工具。它负责系统启动、服务管理、日志记录等核心功能&#xff0c;显著提升了系统的启动速…

【一维前缀和与二维前缀和(简单版dp)】

1.前缀和模板 一维前缀和模板 1.暴力解法 要求哪段区间&#xff0c;我就直接遍历那段区间求和。 时间复杂度O(n*q) 2.前缀和 ------ 快速求出数组中某一个连续区间的和。 1&#xff09;预处理一个前缀和数组 这个前缀和数组设定为dp&#xff0c;dp[i]表示&#xff1a;表示…

在Windows和Linux系统上的Docker环境中使用的镜像是否相同

在Windows和Linux系统上的Docker环境中使用的镜像是否相同&#xff0c;取决于具体的运行模式和目标平台&#xff1a; 1. Linux容器模式&#xff08;默认/常见场景&#xff09; Windows系统&#xff1a; 当Windows上的Docker以Linux容器模式运行时&#xff08;默认方式&#xf…

植物来源药用天然产物的合成生物学研究进展-文献精读121

植物来源药用天然产物的合成生物学研究进展 摘要 大多数药用天然产物在植物中含量低微&#xff0c;提取分离困难&#xff1b;而且这些化合物一般结构复杂&#xff0c;化学合成难度大&#xff0c;还容易造成环境污染。基于合成生物学技术获得药用天然产物具有绿色环保和可持续发…

JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源&#xff1a;在这位大佬的基础上添加了一些东西&#xff0c;欢迎大家支持原创&#xff0c;大佬太棒了&#xff1a;JavaScript |&#xff08;五&#xff09;DOM简介 | 尚硅谷JavaScript基础…

浏览器工作原理深度解析(阶段二):HTML 解析与 DOM 树构建

一、引言 在阶段一中&#xff0c;我们了解了浏览器通过 HTTP/HTTPS 协议获取页面资源的过程。本阶段将聚焦于浏览器如何解析 HTML 代码并构建 DOM 树&#xff0c;这是渲染引擎的核心功能之一。该过程可分为两个关键步骤&#xff1a;词法分析&#xff08;Token 化&#xff09;和…

The Illustrated Stable Diffusion

The Illustrated Stable Diffusion 1. The components of Stable Diffusion1.1. Image information creator1.2. Image Decoder 2. What is Diffusion anyway?2.1. How does Diffusion work?2.2. Painting images by removing noise 3. Speed Boost: Diffusion on compressed…

yarn 装包时 package里包含sqlite3@5.0.2报错

yarn 装包时 package里包含sqlite35.0.2报错 解决方案&#xff1a; 第一步&#xff1a; 删除package.json里的sqlite35.0.2 第二步&#xff1a; 装包&#xff0c;或者增加其他的npm包 第三步&#xff1a; 在package.json里增加sqlite35.0.2&#xff0c;并运行yarn装包 此…

一个免费 好用的pdf在线处理工具

pdf24 doc2x 相比上面能更好的支持数学公式。但是收费