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
相关推荐
꧁坚持很酷꧂2 小时前
解决虚拟机Ubuntu22.04连接了串口设备但终端没有显示
ubuntu
Henry_Lau6173 小时前
主流IDE常用快捷键对照
前端·css·ide
我命由我123454 小时前
VSCode - Prettier 配置格式化的单行长度
开发语言·前端·ide·vscode·前端框架·编辑器·学习方法
Lime-30904 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
LYFlied8 小时前
TypeScript 常见面试问题
ubuntu·面试·typescript
zfj3218 小时前
vscode是js开发的,为什么能支持golang java等各种语言开发
javascript·vscode·golang
暴躁的菜鸡8 小时前
postgresql16.8二进制包编译
ubuntu·postgresql
^乘风破浪^9 小时前
Ubuntu部署Xingrin(星环)企业级漏洞扫描与资产管理平台
linux·运维·ubuntu
꧁坚持很酷꧂9 小时前
把虚拟机Ubuntu中的USB设备名称改为固定名称
linux·数据库·ubuntu
HIT_Weston10 小时前
63、【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(七)
前端·ubuntu·gitlab