MIT 6.S081 lab0:配置xv6环境+vscode调试

前言

系统为Archlinux物理机,环境如下:

使用的xv6版本为2021版,运行环境为vscode + clangd + gbd。

安装依赖

参考:https://pdos.csail.mit.edu/6.828/2021/tools.html

首先安装转义riscv64的包:

1
sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb

测试一下环境

1
2
riscv64-linux-gnu-gcc --version
qemu-system-riscv64 --version

如果出现下图就说明成功了:

安装运行xv6的模拟器:

官网上的qemu-arch-extra已经被替换为了qemu-arch-extra-git。

1
sudo pacman -S qemu-arch-extra-git

到这需要的环境就装完了(不会装vscode建议退课)

编译运行xv6

参考:https://pdos.csail.mit.edu/6.828/2021/labs/util.html

1
2
git clone git://g.csail.mit.edu/xv6-labs-2021
cd xv6-labs-2021

课程里提到实验用的xv6和实际发布的不太一样,所以别下载github上的,用课程官网的这个。如果要其他年份的就把末尾的xv6-labs-2021改为其他年份就行。

可以发现master分支里啥也没有,我们先切换到lab1用到的util分支:

1
git checkout util

这时候ls一下就会出现xv6的源码了:

然后用qemu编译一下看看

1
make qemu

最后出现这几行就说明编译成功了,按ctrl + a, x退出模拟环境。

这里会遇到几个坑:

编译显示infinite recursion detected

解决方案见https://github.com/mit-pdos/xv6-riscv/pull/126。

由于实现的是操作系统,需要很高的代码可靠性,所以MIT在Makefile里设置了把所有警告都视为错误。在user/sh.cruncmd前添加一行__attribute__((noreturn))即可。

编译在最后一步卡住

如果用的是2020版的xv6,由于老版本的qemu和新版本的不兼容,可以使用downgrage来降级qemu.

1
sudo downgrade qemu-arch-extra

选择5.2.0或以前的版本即可。

也可以用源码编译安装老版本的qemu,参考:https://www.xujintong.com/2023/12/24/187/

PS:经过亲身试验,2021版和2020版在实验内容上一模一样,所以建议用2021版,这样就不用降级qemu

配置VScode和clangd

配中文、主题什么的就不说了。

需要安装的插件有两个:C/C++(用来配置GDB调试)、clangd (代码补全)。

可以发现clangd找不到标准库和xv6的库,需要用compile_commands.json文件来指明,可以用bear包来自动生成。

1
2
3
sudo pacman -S bear
make clean # 清空上一次编译的内容
bear -- make qemu

然后compile_commands.json文件里就指明了编译所需头文件的路径:

配置代码自动调整格式(可选)

xv6的代码风格也太古老了,看的特别不顺眼,所以用llvm的代码风格魔改了一下。

首先按ctrl + ,,进入vscode的设置,搜索format on save,打上钩,这样在按ctrl + s保存代码的时候就可以自动格式化代码。

然后在xv6的根目录新建文件.clang-format,借用一下这个老哥的文件:https://github.com/kehanXue/google-style-clang-format/blob/master/.clang-format。把里面的.clang-format复制到我们的文件里面就行,tab-size什么的不习惯2也可以改为4。

需要注意的是,不要配置自动为头文件排序,不然声明顺序不对会提示函数未声明。在.clangd-format里面设置SortIncludes: false

使用VScode + gdb调试

terminal调试效率太低了(也可能是我太菜了),所以用vscode配置launch.json来用图形化界面。

详细解释参考:https://www.cnblogs.com/KatyuMarisaBlog/p/13727565.html,这里就不说细节了。

xv6根目录新建目录.vscode,里面新建文件launch.json。把下面这一段东西复制进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"version": "0.2.0",
"configurations": [
{
"name": "debug xv6",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/kernel/kernel",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"miDebuggerServerAddress": "localhost:26000",
"miDebuggerPath": "/usr/bin/riscv64-linux-gnu-gdb",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "pretty printing",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"logging": {
// "engineLogging": true,
// "programOutput": true,
}
}
]
}

注意midDebuggerPath这一行,如果你用的是riscv64-linux-gnu-gdb就填riscv64-linux-gnu-gdb,如果是riscv64-unknown-elf-gcc就填riscv64-unknown-elf-gcc,其他的同理。

之后运行

1
make qemu-gdb

来开启qemugdb接口,可以看到用的接口是26000

xv6根目录会自动新增一个gdbinit文件,把文件里的target remote 127.0.0.1:26000行删除。

每一次执行make clean时都要把这一行删除,目前没找到一劳永逸的办法。

然后在需要调试的文件里添加断点,按下F5gbd正确停止到kernelmain函数里。

在需要调试的代码前加断点,这里用第一个实验sleep.c为例:

可以看到断点是灰红色+空心的,说明vscode并没有正确切换符号表,我们打开调试控制台,输入-exec file /user/_sleep,然后就发现断点变红+实心了。

xv6终端中输入sleep 10来运行程序,点击上方的继续按钮,gdb将会运行到断点处停下,然后就和调试其他程序一样用就行。

关于提交lab

管理code参考:https://xv6.dgs.zone/labs/use_git/git1.html

主要说一说怎么提交。

首先在这个网站注册账号并复制api-KEY:https://6828.scripts.mit.edu/2021/handin.py/

将所有改动提交到github后,在根目录输入:

1
make handin

之后会提示让输入api-key,复制进去回车就行。如果api-key修改了,可以在文件myapi.key同步修改即可。


MIT 6.S081 lab0:配置xv6环境+vscode调试
https://acmicpc.top/2024/02/08/MIT-6.S081-lab0-配环境/
作者
江欣婷
发布于
2024年2月8日
许可协议