准备工作
Linux 系统,我是在实验室配的主机上装了 Debian Bookworm,然后mac 通过 ssh 连接上去进行操作,宿舍里则是使用的 wsl2,里面的发行版也是 Debian Bookworm。
开始配置
clone 源码
在 ~/Documents/code/mit
目录下执行 git clone git://g.csail.mit.edu/xv6-labs-2021
,将源码 clone 下来。并执行 git clone https://github.com/mit-pdos/xv6-riscv-book.git
,这个是参考资料(即 PDF 对应的 Latex 源码)
前面 clone 下来的 repository 包含了多个分支,每个分支对应一个 Lab。
执行 cd xv6-labs-2021 && git checkout util
,切换到 Lab Utilities 对应的 分支。
安装工具
执行以下两条命令:
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
从而安装对应工具。
开始调试
这里会用到 tmux 的功能(非必需),在 util
分支下的 ~/Documents/code/mit/xv6-labs-2021
目录下,执行 make qemu-gdb
, 然后先按 ctrl+b
再按 %
键,在 iterm2 的右侧创建一个新 panel,如图
我们需要修改一下源文件,在 sh.c
中,在 $56$ 行附近,void runcmd(struct cmd *cmd)
之前添加 __attribute__((noreturn))
,这样才能正常启动系统。
右侧的 panel 也切换到上述目录,然后运行 gdb-multiarch
,之后会进入 gdb
终端命令界面,执行 set architecture riscv:rv64
以调试 RISCV 架构,然后执行 target remote localhost:26000
(这里端口号要看 make qemu-gdb
的输出),从而调试 QEMU 中的 xv6 系统,执行 file kernel/kernel
命令说明我们要调试 kernel/kerel.c
编译生成的可执行文件 kernel
。
我们可以看一下 kernel.asm
的内容,如下图:
然后回到 GDB 对应的 panel,然后执行 b _entry
,于是在 _entry
这里打了个断点。
说明我们调试 xv6 没什么问题了,亦说明环境已经配置好了。
之后,为了方便起见,我们可以在当前目录创建 .gdbinit
,从而使得每次启动 GDB 都能执行 .gdbinit
中的命令,省得我们再一遍遍敲,.gdbinit
的内容如下:
set architecture riscv:rv64
target remote localhost:26000
然后在 ~/.config/gdb/gdbinit
文件中追加一行,内容为 add-auto-load-safe-path /home/zwyyy/Documents/code/mit/xv6-labs-2021/.gdbinit
。
之后就能直接 gdb-multiarch
调试 xv6 了。