【xv6学习】L0_环境配置

xv6 是由麻省理工学院(MIT)开发的一个、用于教学目的的简化版类 Unix 操作系统

其核心价值在于,它用现代的方式重新实现了经典的 Unix Version 6 (V6) 系统,旨在清晰地理解操作系统的核心概念与底层实现。

⭐️ 简要总结一下:本文主要是在搭建基本的环境配置,这是后期学习的基础;需要了解的是qemu,xv6之间的关系

文章目录

关于为什么学

相比动辄数百万行代码的现代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

Index of /2020/labs

关于xv6 和qemu

维度 xv6 QEMU
本质身份 操作系统内核 (Operating System Kernel) 模拟器/虚拟机 (Emulator / Virtual Machine)
角色定位 被运行者 (The Guest) 运行容器 (The Host / Simulator)
主要功能 管理硬件资源(CPU、内存、磁盘),为用户程序提供服务。 用软件模拟出一套完整的硬件环境(CPU、内存、磁盘、中断控制器等)。
类比 就像 WindowsLinux 就像 一台没有操作系统的裸机电脑
依赖关系 必须运行在硬件上(可以是真机,也可以是QEMU模拟的假机器)。 独立运行,可以模拟各种架构(x86, ARM, RISC-V等)。
  1. QEMU 提供了"假硬件"
    当你运行 QEMU 时,它会向 xv6 展示一套看起来像真实硬件的环境。例如:
    • 它告诉 xv6:"我有一个 RISC-V 架构的 CPU。"
    • 它告诉 xv6:"我有一块内存,地址从 0x80000000 开始。"
    • 它模拟了一个 UART 串口设备,让 xv6 可以打印字符到你的终端屏幕上。
  2. xv6 管理"假硬件"
    xv6 启动后,会像在真实电脑上一样工作:
    • 它初始化 QEMU 模拟的虚拟 CPU。
    • 它设置虚拟的页表来管理虚拟内存。
    • 它通过读写特定的 I/O 地址(由 QEMU 规定)来向你的终端打印 "init: starting shell"。

为什么我们用 QEMU 来跑 xv6?

你可能会问,为什么不把 xv6 直接装在真电脑上?

  1. 避免灾难 :操作系统内核拥有最高权限。初学者在编写内核代码(如处理中断、写内存)时,一个微小的错误(比如写了错误的内存地址)就会导致整个电脑瞬间死机或重启。在 QEMU 里崩溃,只是关掉一个窗口而已,非常安全
  2. 硬件无关性:xv6 教学版主要运行在 RISC-V 架构上。大多数人的电脑是 x86 架构。QEMU 可以在 x86 电脑上完美模拟 RISC-V 环境,让你无需购买昂贵开发板就能学习。
  3. 调试神器: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是一种用于调试的工具,下面是一些常用的命令

  1. 启动 : gdb ./myprogram
  2. 设置断点 : b main
  3. 运行 : r
  4. 程序会在 main 函数暂停
  5. 单步执行 : ns
  6. 查看变量 : p my_variable
  7. 继续运行 : c
  8. 退出 : 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 内核的断点、单步、查看寄存器等操作。

相关推荐
实验如有神祝女士15 小时前
不同参数规模大模型在医学翻译场景的适配差异
论文阅读·人工智能·深度学习·学习·算法·语言模型·论文笔记
映翰通网络16 小时前
TI开发板上的边缘AI工具链:先认清OpenCV、GStreamer和TIDL
人工智能·嵌入式硬件·opencv·计算机视觉·ti
论迹复利17 小时前
Smith 圆图实战——从原理到 L 型匹配网络设计
嵌入式硬件·无线
论迹复利17 小时前
平台安全架构(PSA)概述——从方法论到工程实践
嵌入式硬件·安全·psa
若衹如初見18 小时前
一步一步学习使用LiveBindings() LiveBindings图像绑定与自定义绑定方法()
学习·命令模式
kdxiaojie18 小时前
Linux 驱动研究 —— V4L2 (15)
linux·运维·笔记·学习
fanged19 小时前
udev番外--动态驱动加载(TODO)
学习
醉城夜风~19 小时前
HTML列表标签学习博客:有序列表、无序列表、自定义列表详解
前端·学习·html
Cachel wood20 小时前
hands-on-modern-rl:动手学强化学习 贝尔曼方程
开发语言·网络·python·学习·embedding