xv6-riscv开发调试环境搭建(vscode+ubuntu)

vscode+ubuntu22

ubuntu远程环境

1.安装必要依赖,保证xv6-riscv项目可以运行

这步比较容易

安装gdb调试工具

从以下网址下载,上传到远程Ubuntu主机

复制代码
https://github.com/sifive/freedom-tools/releases

https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz

然后:

复制代码
sudo mkdir -p /opt/riscv
sudo tar -xzf riscv64-unknown-elf-toolchain-*.tar.gz -C /opt/riscv --strip-components=1
echo 'export PATH=/opt/riscv/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

验证安装

复制代码
riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gdb --version

xv6文件改动

.gdbinit.tmpl-riscv,原始

复制代码
set confirm off
set architecture riscv:rv64
target remote 127.0.0.1:1234
symbol-file kernel/kernel
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes

去掉第三行和第四行,修改为:

复制代码
set confirm off
set architecture riscv:rv64

set disassemble-next-line auto
set riscv use-compressed-breakpoints yes
如果是阿里云主机,勿忘防火墙放行25000端口或者26000端口
vscode的C/C++ (by Microsoft)插件也需要安装到远程ubuntu主机上

windows+vscode端

本地 VSCode 必备插件

在 VSCode 安装:

  • Remote - SSH
  • C/C++ (by Microsoft)
  • CodeLLDB(可选)
  • Native Debug(可选)

远程打开 xv6 项目(把远程的xv6项目同步到本地)

  1. 在 VSCode 打开命令面板(Ctrl+Shift+P)

  2. 选择:

    复制代码
    Remote-SSH: Connect to Host...
  3. 连接你的云主机。

  4. 打开 xv6-riscv 项目所在目录。

在 VSCode 中创建调试配置

在项目根目录创建(或编辑) .vscode/launch.json

复制代码
{
  "version": "0.2.0",
  "configurations": [
      {
          "name": "debug xv6",
          "type": "cppdbg",
          "request": "launch",
          "program": "${workspaceFolder}/kernel/kernel",
          // "program": "${workspaceFolder}/user/_ls",
          "args": [],
          "stopAtEntry": true,
          "cwd": "${workspaceFolder}",
          "miDebuggerServerAddress": "localhost:25000",
          "miDebuggerPath": "/opt/riscv/bin/riscv64-unknown-elf-gdb",
          "environment": [],
          "externalConsole": false,
          "MIMode": "gdb",
          "setupCommands": [
              {
                  "description": "pretty printing",
                  "text": "-enable-pretty-printing",
                  "ignoreFailures": true
              }
          ],
          "logging": {
              // "engineLogging": true,
              // "programOutput": true,
          }
      }
  ]
}

如果想要调试内核则:

复制代码
"program": "${workspaceFolder}/kernel/kernel",

如果想要调试用户程序则:

复制代码
"program": "${workspaceFolder}/user/_ls",

调试流程

  1. 在 VSCode 中,终端执行:

    复制代码
    make clean
    make qemu-gdb

    让 QEMU 进入等待调试状态。

  2. 在 VSCode "运行与调试"面板选择:

    复制代码
    Debug xv6 (remote QEMU)

    然后点 ▶️ 启动调试。

  3. main.ctrap.c 等地方设置断点。

  4. 现在你可以:

    • 单步执行(F10 / F11)
    • 查看寄存器、堆栈
    • 调用栈浏览

参考

复制代码
https://www.cnblogs.com/KatyuMarisaBlog/p/13727565.html
https://karthikv1392.github.io/cs3301_osn/slides/Tutorials/xv6_debug_vscode.pdf

调试技巧

可以先单cpu运行,修改makefile

复制代码
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 1 -nographic 

可以不启动时钟中断,kernel/start.c

复制代码
// timerinit();  // 注释掉或暂时禁用

mkfs.c的调试

在图形界面的ubuntu宿主机上安装vscode,并打开xv6项目。

配置.vscode/launch.json

复制代码
{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "Debug mkfs",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/mkfs/mkfs",
        "args": ["fs.img",
        "user/_init",
        "user/_sh",
        "user/_cat",
        "user/_echo",
        "user/_ls"],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": true,
        "MIMode": "gdb",
        "miDebuggerPath": "/usr/bin/gdb"
      }
    ]
  }

修改makefile(加了-g选项,生成调试符号表)

复制代码
mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h
	gcc -Wno-unknown-attributes -I. -o mkfs/mkfs mkfs/mkfs.c

复制代码
mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h
	gcc -Wno-unknown-attributes -g -I. -o mkfs/mkfs mkfs/mkfs.c

运行make qemu编译

然后在vscode中启动调试。

mkfs.c的作用

使用宿主机即linux文件系统调用生成xv6格式的文件系统fs.img,并将所有的用户程序写入。然后qemu将其模拟成一个块设备。

然后内核启动后,通过virtio-blk driver(bio.c,virtio_disk.c),读写fs.img

复制代码
qemu-system-riscv64 -drive file=fs.img,format=raw
相关推荐
虚伪的空想家43 分钟前
华为昇腾Atlas 800 A2物理服务器开启VT-d模式
运维·服务器·ubuntu·kvm·vt-d·直通
q***18842 小时前
Ubuntu上安装、使用Redis的详细教程
redis·ubuntu·bootstrap
人工智能训练3 小时前
windows系统中的docker,xinference直接运行在容器目录和持载在宿主机目录中的区别
linux·服务器·人工智能·windows·ubuntu·docker·容器
代码对我眨眼睛3 小时前
Ubuntu 系统 NVIDIA 显卡驱动自动化安装全流程
linux·ubuntu·自动化
xuyanqiangCode3 小时前
Ubuntu二进制安装Apache Doris(2.1版本)
linux·ubuntu·apache
(づど)4 小时前
解决VSCode中安装Go环境Gopls失败的问题
vscode·golang
曹牧11 小时前
Eclipse为方法添加注释
java·ide·eclipse
Warren9814 小时前
Python自动化测试全栈面试
服务器·网络·数据库·mysql·ubuntu·面试·职场和发展
HIT_Weston14 小时前
39、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(二)
linux·前端·ubuntu
zandy101114 小时前
2025年11月AI IDE权深度测榜:深度分析不同场景的落地选型攻略
ide·人工智能·ai编程·ai代码·腾讯云ai代码助手