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

news2025/3/25 23:03:05

文章目录

  • 获取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:$PATH
 qemu-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.coloradmin.cn/o/2319951.html

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

相关文章

并查集——108. 冗余连接

108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图: 现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图: 先请你找出冗余边,删除后…

初识XXL-JOB分布式任务调度

XXL-JOB架构分析 设计思想 将调度行为抽象形成"调度中心"公共平台&#xff0c;而平台自身并不承担业务逻辑&#xff0c;"调度中心"负责发起调度请求。 将任务抽象成分散的JobHandler&#xff0c;交由"执行器"统一管理&#xff0c;"执行器…

【数据结构进阶】位图

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、位图的概念与结构 二、位图的实现 1. 结构定义 2. 构造函数 3. 三大接口实现 set unset test 总代码 4. 测试 三、 标准库的…

[极客大挑战 2019]BabySQL—3.20BUUCTF练习day4(3)

[极客大挑战 2019]BabySQL-3.20BUUCTF练习day4(3) 做题过程 打开是以下页面&#xff08;前几天有它的第一版和第二版出现&#xff09;输入1’ 回显以下内容&#xff08;还是字符型以单引号闭合&#xff0c;因为有报错信息回显&#xff09; 输入1 order by 4%23回显成这个 被过…

JVM 学习前置知识

JVM 学习前置知识 Java 开发环境层次结构解析 下图展示了 Java 开发环境的层级关系及其核心组件&#xff0c;从底层操作系统到上层开发工具&#xff0c;逐步构建完整的开发与运行环境&#xff1a; 1. 操作系统&#xff08;Windows, MacOS, Linux, Solaris&#xff09; 作用&…

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…

解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题

配置类 [Section1] Key_AAA Value[Section2] AnotherKey Value默认情况下&#xff0c;ConfigParser会将ini配置文件中的KEY&#xff0c;转为小写。 重载后配置类&#xff1a; 继承类从configparser.ConfigParser改为configparser.RawConfigParser重载方法optionxform&#…

什么是 BA ?BA怎么样?BA和BI是什么关系?

前几天有朋友在评论区提到了BA这个角色&#xff0c;具体是干什么的&#xff0c;我大概来说一下。 什么是BA BA 英文的全称是Business Analyst&#xff0c;从字面上意思就是商业分析师&#xff0c;做过商业智能BI项目的应该比较了解。实际上以我个人的经验&#xff0c;BA 的角…

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本&#xff1a;5.4.1

Python帕累托图(Pareto Chart): 从数据排序到决策优化

帕累托图&#xff08;Pareto Chart&#xff09;是一种基于80/20法则的经典数据可视化工具&#xff0c;广泛应用于质量管理、项目管理、业务分析等领域。本文将从其原理、构成、实现方法到应用场景进行全面解析&#xff0c;并附Python代码示例。 一、帕累托图的定义与起源 帕累…

Python---数据分析(Pandas六:二维数组DataFrame,DataFrame的创建,DataFrame的属性)

一、 二维数组DataFrame DataFrame 是 Pandas 中的一个表格型的数据结构&#xff0c;包含有多列的数据&#xff0c;每列可以是不同的值类型(数值、字符串、布尔型等)&#xff0c;DataFrame 即有行索引也有列索引&#xff0c;可以被看做是由 Series 组成的字典。 二、DataFrame的…

内网安全-横向移动Kerberos 攻击SPN 扫描WinRMWinRSRDP

1.WinRM&WinRS 条件&#xff1a; 双方开启winrm winrs服务 2008版本以上默认开启&#xff0c;win 7默认关闭 检测使用cs内置端口扫描5985开放情况 进行连接 winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 whoami 2.内网-spn shell setspn -T …

深入理解 lt; 和 gt;:HTML 实体转义的核心指南!!!

&#x1f6e1;️ 深入理解 < 和 >&#xff1a;HTML 实体转义的核心指南 &#x1f6e1;️ 在编程和文档编写中&#xff0c;< 和 > 符号无处不在&#xff0c;但它们也是引发语法错误、安全漏洞和渲染混乱的头号元凶&#xff01;&#x1f525; 本文将聚焦 <&#…

红数码影视(RED Digital Cinema)存储卡格式化后的恢复方法

红数码影视(RED Digital Cinema)的摄像机可以生成两种RAW级高清视频文件&#xff0c;一种是R3D&#xff0c;一种是MOV。其中MOV属于苹果(apple)公司的QT视频封装结构&#xff0c;使用的视频编码是Apple ProRes;而R3D则是RED公司自创的RAW视频文件&#xff0c;这种文件解码需要使…

关于TVS管漏电流的问题?

问题描述&#xff1a; 在量产的带电池故事机生产中&#xff0c;工厂产线测试电流时&#xff0c;有1台机器电流比正常机器大10mA左右。 原因分析&#xff1a; 1、分析电路原理图&#xff0c;去除可能出现问题的电压或器件&#xff08;不影响系统&#xff09;&#xff0c;发现…

区块链交易所平台开发全解析

在数字化飞速发展的今天&#xff0c;区块链技术已成为金融领域的核心驱动力之一。作为数字货币交易的关键平台&#xff0c;区块链交易所的开发不仅涉及复杂的技术环节&#xff0c;还需要兼顾用户体验、安全性、合规性等多个方面。本文将深入探讨区块链交易所平台的开发流程、关…

蓝桥杯_拔河_java

佬们能不能对思路二提供点建议&#xff0c;一直过不了T_T。 题目 思路 首先感觉有个坑点&#xff0c;就是可以不用把所有学生都选上&#xff0c;但是一定要保证两个部分学生的编号是连续的。比如一共5个人&#xff0c;编号是{1&#xff0c;2&#xff0c;3&#xff0c;4&#xf…

fastapi 实践(三)Swagger Docs

fastapi 实践&#xff08;一&#xff09;基础 fastapi 实践&#xff08;二&#xff09;异常捕获 fastapi 实践&#xff08;三&#xff09;Swagger Docs fastapi Swagger 1. FastAPI 交互式 API 文档2. 故障解决2.1. FastAPI 访问 docs 显示空白/加载失败2.2. Swagger 报错&…

每日一题力扣3248.矩阵中的蛇c++

3248. 矩阵中的蛇 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int finalPositionOfSnake(int n, vector<string>& commands) {int i 0;int j 0;for (int k0;k<commands.size();k) {if (commands[k] "RIGHT")j;else if (comma…

Channel-wise Knowledge Distillation for Dense Prediction论文阅读和

paper&#xff1a;https://arxiv.org/pdf/2011.13256.pdf code&#xff1a;https://github.com/open-mmlab/mmrazor 这篇paper主要是商汤开源的mmrazor中提及在detection有效果&#xff0c;我之前记录的几篇sota文章虽然在各自的paper中在detection领域都有提及有增益&#…