xv6 是由麻省理工学院(MIT)开发的一个、用于教学目的的简化版类 Unix 操作系统;
其核心价值在于,它用现代的方式重新实现了经典的 Unix Version 6 (V6) 系统,旨在清晰地理解操作系统的核心概念与底层实现。
⭐️ 简要总结一下:本文主要是在搭建基本的环境配置,这是后期学习的基础;需要了解的是qemu,xv6之间的关系
文章目录
- 关于为什么学
- [关于xv6 和qemu](#关于xv6 和qemu)
-
- [为什么我们用 QEMU 来跑 xv6?](#为什么我们用 QEMU 来跑 xv6?)
- 基于WSL搭建环境
-
- 设置wsl的环境名
- 切换挂载位置
- [配置ssh 和ip](#配置ssh 和ip)
- 用vscode的wsl插件连接上
- 安装下载源码
- 一些其他~
关于为什么学
相比动辄数百万行代码的现代Linux内核,xv6的精简性使得学习者可以:
- 从头到尾阅读和理解整个操作系统源码。
- 亲手修改和扩展内核功能(如添加系统调用、实现新调度算法),通过实践巩固理论。
- 深入理解硬件(如CPU寄存器、中断)与软件的协同工作机制,而无需被现代系统的复杂抽象层淹没
- 作为跳板,理解Linux、Android等现代类Unix系统的设计根源
一些学习资料
官方教材与一些学习资料:https://pdos.csail.mit.edu/6.828/2020/xv6.html
xv6-book-2020-Chinese:MIT 6.S081课程用书XV6-book中文翻译 - AtomGit
关于xv6 和qemu
| 维度 | xv6 | QEMU |
|---|---|---|
| 本质身份 | 操作系统内核 (Operating System Kernel) | 模拟器/虚拟机 (Emulator / Virtual Machine) |
| 角色定位 | 被运行者 (The Guest) | 运行容器 (The Host / Simulator) |
| 主要功能 | 管理硬件资源(CPU、内存、磁盘),为用户程序提供服务。 | 用软件模拟出一套完整的硬件环境(CPU、内存、磁盘、中断控制器等)。 |
| 类比 | 就像 Windows 或 Linux。 | 就像 一台没有操作系统的裸机电脑。 |
| 依赖关系 | 必须运行在硬件上(可以是真机,也可以是QEMU模拟的假机器)。 | 独立运行,可以模拟各种架构(x86, ARM, RISC-V等)。 |
- QEMU 提供了"假硬件" :
当你运行 QEMU 时,它会向 xv6 展示一套看起来像真实硬件的环境。例如:- 它告诉 xv6:"我有一个 RISC-V 架构的 CPU。"
- 它告诉 xv6:"我有一块内存,地址从 0x80000000 开始。"
- 它模拟了一个 UART 串口设备,让 xv6 可以打印字符到你的终端屏幕上。
- xv6 管理"假硬件" :
xv6 启动后,会像在真实电脑上一样工作:- 它初始化 QEMU 模拟的虚拟 CPU。
- 它设置虚拟的页表来管理虚拟内存。
- 它通过读写特定的 I/O 地址(由 QEMU 规定)来向你的终端打印 "init: starting shell"。
为什么我们用 QEMU 来跑 xv6?
你可能会问,为什么不把 xv6 直接装在真电脑上?
- 避免灾难 :操作系统内核拥有最高权限。初学者在编写内核代码(如处理中断、写内存)时,一个微小的错误(比如写了错误的内存地址)就会导致整个电脑瞬间死机或重启。在 QEMU 里崩溃,只是关掉一个窗口而已,非常安全。
- 硬件无关性:xv6 教学版主要运行在 RISC-V 架构上。大多数人的电脑是 x86 架构。QEMU 可以在 x86 电脑上完美模拟 RISC-V 环境,让你无需购买昂贵开发板就能学习。
- 调试神器:QEMU 提供了强大的调试接口。你可以配合 GDB,让 xv6 在启动的 第一行代码处停下,单步执行每一行内核代码,这在真实硬件上很难做到。
基于WSL搭建环境
具体怎么配置wsl的,这边有好多教程,我就不赘述了,这边只记录个人感觉后续用的上的部分; WSL配置
注意,最好使用Ubuntu24版本以上的,博主用的是Ubuntu22,遇到了一些坑,当然解决了~ 下面就开始学吧~
设置wsl的环境名
为了配置环境人能看得懂,大概长这样:

c
# 查看运行情况
wsl -l -v
# 导出发行版
wsl --export 发行名 位置(D:/ChDevelop/WSL/发行.tar)
# 注销发行版
wsl --unregister 发行名
# 重新导入发行名并命名
wsl --import 发行名 发行版存储路径(D:/WSL/Ubuntu_22.04)
发行版存储位置(D:/WSL/发行.tar)
切换挂载位置
补充------什么是挂载
挂载 = 把一个存储设备(或目录)连接到 Linux 目录树上的某个位置,让它可以被访问
在 Windows 里:插入 U 盘 → 自动分配盘符 E:\
在 Linux 里:插入 U 盘 → 手动或自动挂载到 /mnt/usb/
具体实现
建议直接修改wsl的conf文件,可以让windows盘符挂载在自定义路径
# 编辑配置文件
sudo nano /etc/wsl.conf
[automount]
# 自定义挂载根目录(默认是 /mnt)
root = /
# 或者改成其他路径
# root = /win
# 自动挂载 Windows 盘符
enabled = true
# 挂载选项
options = "metadata,umask=22,fmask=11"
保存后
# 退出 WSL
exit
# 在 Windows 中关闭所有 WSL
wsl --shutdown
# 重新进入
wsl
配置说明:
| 配置项 | 作用 | 示例 |
|---|---|---|
root = / |
将盘符挂载到根目录 | D: → /d/ |
root = /windows |
挂载到自定义目录 | D: → /windows/d/ |
root = /mnt |
默认行为(不修改) | D: → /mnt/d/ |
配置ssh 和ip
# 在虚拟机里面装ssh服务端
sudo apt install openssh-server -y
# 查虚拟机ip
ip addr show
用vscode的wsl插件连接上


安装下载源码
# 1. 先更新 apt 缓存
sudo apt update
# 2. 安装工具栏 克隆并编译 xv6
sudo apt install -y git gcc gcc-riscv64-linux-gnu qemu-system-misc make \
&& git clone git://g.csail.mit.edu/xv6-labs-2024 \
&& cd xv6-labs-2024 \
&& make
注意:
gcc-riscv64-linux-gnu 是risc-v交叉编译器
qemu-system-misc 是用于模拟risc-v的硬件
然后就可以看到

之后启动make qemu(编译xv6 在qemu启动)
make qemu
一般来说描述符变成了这样就是好了

一些bug(如果启动成功不用看了)
如果make qemu的时候和我出现一样的情况,卡住不动了,

可能原因是(我就是)ubuntu版本太老了,安装的qemu版本老,但是用的又是最新的xv6-lab课程,就会有启动卡死的行为
最直接的解决方式------卸载原来的老的qemu,然后重新安装新的!
gdb调试
结合ai是说 qemu的版本问题,2024的 xv6-labs-2024使用了 RISC-V 的 SSTC(Supervisor-level Timer Compare)扩展,我的 QEMU 6.2(2021版本)默认不支持 xv6-labs-2024 所需要的 SSTC,所以启动卡死
_entry
|
v
start()
|
v
timerinit()
|
v
访问 stimecmp
|
v
异常
|
v
无法进入 main()

终端1
make qemu-gdb
终端2
sudo apt update
sudo apt install gdb-multiarch
set architecture riscv:rv64
gdb-multiarch kernel/kernel
target remote :26000
# 设置断点
b start
#继续
c
#汇编和反汇编
layout asm
disassemble start

最终

配置gdb------方便在vscode交互调试
gdb是一种用于调试的工具,下面是一些常用的命令
- 启动 :
gdb ./myprogram- 设置断点 :
b main- 运行 :
r- 程序会在
main函数暂停。- 单步执行 :
n或s- 查看变量 :
p my_variable- 继续运行 :
c- 退出 :
q
xv6 是 RISC-V架构,普通的gdb 只能调试 x86 程序,无法识别 RISC-V指令集。gdb-multiarch 是一个支持多种架构的 GDB 版本,能够调试 RISC-V 程序。
终端执行:
sudo apt update
sudo apt install gdb-multiarch
安装完成后验证路径:
which gdb-multiarch
/usr/bin/gdb-multiarch
这个路径后面要填入配置文件;
同时有一个端口号要记住:qemu启动时候会监听TCP端口等待gdb连接,xv6默认使用26000的端口,可以通过执行make qemu-gdb获取;

配置.gdbinit

把目录下的.gdbinit 文件覆盖
set confirm off
set architecture riscv:rv64
symbol-file kernel/kernel
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes
同时输入:
echo "set auto-load safe-path /" >> ~/.gdbinit
表示信任所有目录下的.gdbinit文件
根目录下添加.vscode/launch.json 和.vscode/tasks.json
launch.json
json
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to gdb",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/kernel/kernel",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"miDebuggerServerAddress": "127.0.0.1:26000",
"miDebuggerPath": "/usr/bin/gdb-multiarch",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "pretty printing",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "xv6build",
"type": "shell",
"isBackground": true,
"command": "make qemu-gdb",
"problemMatcher": [
{
"pattern": [
{
"regexp": ".",
"file": 1,
"location": 2,
"message": 3
}
],
"background": {
"beginsPattern": ".*Now run 'gdb'.",
"endsPattern": "."
}
}
]
}
]
}
验证和配置
先输入
make qemu-gdb

然后点击

芜湖!!

多线程情况,调试情况下可以用单核模式启动
make qemu-gdb CPUS=1
一些其他~
也可以用VMware 完成上述环境配置,但是wsl更加轻量;
VMware
VMware 会虚拟出完整的硬件------CPU、内存、硬盘、主板、网卡、光驱......这是一台裸机(Bare Metal) 。
ISO 文件对它来说,就是一张真实的系统安装盘。虚拟机从"光驱"启动,执行完整的安装流程:分区、格式化、复制文件、配置引导......最后才得到一个能用的系统
wsl
WSL (Windows Subsystem for Linux) 是微软为 Windows 提供的、在 Windows 内部直接运行 Linux 环境的一项功能。它让你无需启动一个完整的虚拟机,就能在 Windows 中使用原生的 Linux 命令行工具、实用程序和应用程序;
WSL 引入了一个轻量级的虚拟机,但它和 VMware 那种"完整虚拟机"完全不同:
- 不是模拟完整硬件 :它用 Windows Hyper-V 的轻量虚拟化技术,只虚拟出一个Linux 内核,而不是整台电脑
- 没有 BIOS/UEFI、没有光驱、没有主板 :启动的不是一台"电脑",而是一个Linux 内核实例
- 不需要 ISO:WSL2 的 Linux 发行版(如 Ubuntu、Debian)是以**打包好的根文件系统(rootfs)**形式分发的。微软和发行版维护者已经预先把系统装好了,打包成一个压缩包。WSL 解压这个包,挂载为虚拟磁盘,直接启动内核即可
- 启动极快:因为跳过了整个"开机自检 → 引导加载 → 系统安装"流程,本质上就是加载一个已经配置好的 Linux 内核 + 文件系统
vscode ssh 和xv6建立连接

VSCode 通过 SSH 进入虚拟机,在虚拟机里启动 gdb-multiarch,GDB 再通过一个 TCP 端口连上 QEMU 内置的调试桩(GDB Stub),从而实现对 xv6 内核的断点、单步、查看寄存器等操作。