MIT 6.S081 lab0:配置xv6环境+vscode调试
前言
系统为Archlinux物理机,环境如下:
使用的xv6版本为2021版,运行环境为vscode + clangd + gbd。
安装依赖
参考:https://pdos.csail.mit.edu/6.828/2021/tools.html
首先安装转义riscv64的包:
1 |
|
测试一下环境
1 |
|
如果出现下图就说明成功了:
安装运行xv6的模拟器:
官网上的qemu-arch-extra已经被替换为了qemu-arch-extra-git。
1 |
|
到这需要的环境就装完了(不会装vscode建议退课)。
编译运行xv6
参考:https://pdos.csail.mit.edu/6.828/2021/labs/util.html
1 |
|
课程里提到实验用的xv6和实际发布的不太一样,所以别下载github上的,用课程官网的这个。如果要其他年份的就把末尾的xv6-labs-2021
改为其他年份就行。
可以发现master分支里啥也没有,我们先切换到lab1用到的util
分支:
1 |
|
这时候ls
一下就会出现xv6的源码了:
然后用qemu
编译一下看看
1 |
|
最后出现这几行就说明编译成功了,按ctrl + a, x
退出模拟环境。
这里会遇到几个坑:
编译显示infinite recursion detected
解决方案见https://github.com/mit-pdos/xv6-riscv/pull/126。
由于实现的是操作系统,需要很高的代码可靠性,所以MIT在Makefile
里设置了把所有警告都视为错误。在user/sh.c
中runcmd
前添加一行__attribute__((noreturn))
即可。
编译在最后一步卡住
如果用的是2020版的xv6
,由于老版本的qemu
和新版本的不兼容,可以使用downgrage
来降级qemu
.
1 |
|
选择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 |
|
然后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 |
|
注意midDebuggerPath
这一行,如果你用的是riscv64-linux-gnu-gdb
就填riscv64-linux-gnu-gdb
,如果是riscv64-unknown-elf-gcc
就填riscv64-unknown-elf-gcc
,其他的同理。
之后运行
1 |
|
来开启qemu
的gdb
接口,可以看到用的接口是26000
。
在xv6
根目录会自动新增一个gdbinit
文件,把文件里的target remote 127.0.0.1:26000
行删除。
每一次执行make clean
时都要把这一行删除,目前没找到一劳永逸的办法。
然后在需要调试的文件里添加断点,按下F5
,gbd
正确停止到kernel
的main
函数里。
在需要调试的代码前加断点,这里用第一个实验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 |
|
之后会提示让输入api-key
,复制进去回车就行。如果api-key
修改了,可以在文件myapi.key
同步修改即可。