
xv6 是由麻省理工学院MIT开发的一个、用于教学目的的简化版类 Unix 操作系统其核心价值在于它用现代的方式重新实现了经典的Unix Version 6 (V6)系统旨在清晰地理解操作系统的核心概念与底层实现。⭐️ 简要总结一下本文主要是在搭建基本的环境配置这是后期学习的基础需要了解的是qemuxv6之间的关系文章目录关于为什么学一些学习资料关于xv6 和qemu为什么我们用 QEMU 来跑 xv6基于WSL搭建环境设置wsl的环境名切换挂载位置补充——什么是挂载具体实现配置ssh 和ip用vscode的wsl插件连接上安装下载源码一些bug如果启动成功不用看了gdb调试最终配置gdb——方便在vscode交互调试验证和配置一些其他~VMwarewslvscode ssh 和xv6建立连接关于为什么学相比动辄数百万行代码的现代Linux内核xv6的精简性使得学习者可以从头到尾阅读和理解整个操作系统源码。亲手修改和扩展内核功能如添加系统调用、实现新调度算法通过实践巩固理论。深入理解硬件如CPU寄存器、中断与软件的协同工作机制而无需被现代系统的复杂抽象层淹没作为跳板理解Linux、Android等现代类Unix系统的设计根源一些学习资料官方教材与一些学习资料https://pdos.csail.mit.edu/6.828/2020/xv6.htmlxv6-book-2020-Chinese:MIT 6.S081课程用书XV6-book中文翻译 - AtomGitIndex of /2020/labs关于xv6 和qemu维度xv6QEMU本质身份操作系统内核(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的环境名为了配置环境人能看得懂大概长这样# 查看运行情况 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,umask22,fmask11 保存后 # 退出 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 的SSTCSupervisor-level Timer Compare扩展我的 QEMU 6.22021版本默认不支持 xv6-labs-2024 所需要的 SSTC所以启动卡死_entry | v start() | v timerinit() | v 访问 stimecmp | v 异常 | v 无法进入 main()终端1make qemu-gdb终端2sudo 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退出:qxv6 是 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.jsonlaunch.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 CPUS1一些其他~也可以用VMware 完成上述环境配置但是wsl更加轻量VMwareVMware 会虚拟出完整的硬件——CPU、内存、硬盘、主板、网卡、光驱……这是一台裸机Bare Metal。ISO 文件对它来说就是一张真实的系统安装盘。虚拟机从光驱启动执行完整的安装流程分区、格式化、复制文件、配置引导……最后才得到一个能用的系统wslWSL (Windows Subsystem for Linux)是微软为 Windows 提供的、在 Windows 内部直接运行 Linux 环境的一项功能。它让你无需启动一个完整的虚拟机就能在 Windows 中使用原生的 Linux 命令行工具、实用程序和应用程序WSL 引入了一个轻量级的虚拟机但它和 VMware 那种完整虚拟机完全不同不是模拟完整硬件它用 Windows Hyper-V 的轻量虚拟化技术只虚拟出一个Linux 内核而不是整台电脑没有 BIOS/UEFI、没有光驱、没有主板启动的不是一台电脑而是一个Linux 内核实例不需要 ISOWSL2 的 Linux 发行版如 Ubuntu、Debian是以**打包好的根文件系统rootfs**形式分发的。微软和发行版维护者已经预先把系统装好了打包成一个压缩包。WSL 解压这个包挂载为虚拟磁盘直接启动内核即可启动极快因为跳过了整个开机自检 → 引导加载 → 系统安装流程本质上就是加载一个已经配置好的 Linux 内核 文件系统vscode ssh 和xv6建立连接VSCode 通过 SSH 进入虚拟机在虚拟机里启动 gdb-multiarchGDB 再通过一个 TCP 端口连上 QEMU 内置的调试桩(GDB Stub)从而实现对 xv6 内核的断点、单步、查看寄存器等操作。