MIT 6.S081 实验环境配置
所做实验版本是 FA20
环境问题
遇到两个问题:
make qemu
报错:user/sh.c:58:1: error: infinite recursion detected [-Werror=infinite-recursion] 58 | runcmd(struct cmd *cmd)
解决:在
CFLAGS
中加上-Wno-error=infinite-recursion
,或者参考这个 issue,在runcmd
函数前加上__attribute__((noreturn))
。make qemu
启动 qemu 时,卡在bashqemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
没有出现
$
这样的 prompt,也无法输入指令。解决:按照 官方文档 的说法,
qemu-system-misc
包经过更新后和 Kernel 不兼容,但按照文档指令sudo apt-get install qemu-system-misc=1:4.2-3ubuntu6
又找不到包,最后按照 stackoverflow 的做法,手动编译 qemu 才可。跟某佬交流后发现 FA21 版本没有这个问题,应该是已经修复了(21 的 tools 文档也没有介绍这个问题)。
vlab 配置
因为 Mac 手动编译 qemu 还是没法跑起来这个 kernel,选择用 vlab 来完成实验。vlab 的机子之前被我删了又开好多次,现在是个空白环境。
实验用不到 GUI,主要做一下终端和远程 VSCode 的设置。
终端配置
首先把默认 shell 换成 zsh:
$ sudo apt update
$ sudo apt install zsh
$ chsh -s /bin/zsh
重启后再连接,echo $SHELL
发现已经变成 zsh。
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
装上后 ~/.zshrc
有一百多行,去掉注释只有:
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="robbyrussell"
plugins=(git)
source $ZSH/oh-my-zsh.sh
改成用 [Antigen](zsh-users/antigen: The plugin manager for zsh. (github.com)) 来管理 zsh plugin
$ sudo apt install zsh-antigen
查了很多文档都没发现 antigen.zsh
在哪,只能
$ sudo find / | grep antigen.zsh
发现在 /usr/share/zsh-antigen/antigen.zsh
把 ~/.zshrc
改成:
source /usr/share/zsh-antigen/antigen.zsh
antigen init ~/.antigenrc
新建 ~/.antigenrc
:
antigen use oh-my-zsh
# Bundles from the default repo.
antigen bundle git
antigen bundle command-not-found
antigen bundle docker
# Other plugins
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-completions
# Load the theme.
antigen theme robbyrussell
# Tell Antigen that you're done.
antigen apply
之后执行 exec zsh
就完成配置了。
VSCode 配置
首先是本机的 ~/.ssh/config
,加上
Host vlab
HostName vlab.ustc.edu.cn
IdentityFile ~/.ssh/vlab.pem
User ubuntu
下载的 vlab.pem
权限需要是 600。
连上后,首先装 [C/C++](C/C++ - Visual Studio Marketplace)、[clangd](clangd - Visual Studio Marketplace) 插件,为了使用 clangd 还需要装上 clangd language server:
$ sudo apt install clangd-12
$ sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100 # 让 clangd-12 变成默认的 clangd
之后输入 clangd --version
可以发现 clangd server 已经装上了。
在全局的 settings.json
里加上:
"clangd.arguments": [
"--log=verbose",
"--pretty",
"--all-scopes-completion",
"--completion-style=bundled",
"--cross-file-rename",
"--background-index",
"--clang-tidy",
"--enable-config",
"--compile-commands-dir=build"
],
同时新建 clangd 的 config.yaml
文件,Windows 在 %LocalAppData%\clangd\config.yaml
,MacOS 在 ~/Library/Preferences/clangd/config.yaml
,Linux 在 ~/.config/clangd/config.yaml
。
内容为
Diagnostics:
ClangTidy:
Add: ["*"]
Remove: [
altera*,
llvmlibc-restrict-system-libc-headers,
cppcoreguidelines-pro-bounds-pointer-arithmetic,
cppcoreguidelines-pro-type-vararg,
cppcoreguidelines-avoid-magic-numbers,
cppcoreguidelines-avoid-non-const-global-variables,
hicpp-vararg,
llvmlibc-callee-namespace,
llvmlibc-implementation-in-namespace,
modernize-use-trailing-return-type,
readability-identifier-length,
readability-magic-numbers,
readability-isolate-declaration,
llvmlibc-restrict-system-libc-headers,
google-objc-function-naming,
bugprone-easily-swappable-parameters,
google-readability-todo,
]
Index:
Background: Build
重新连接,可以发现已经有了报错提示。由于项目是通过 Makefile 组织的,还需要生成 compile_commands.json
才能识别项目结构。选用 Bear。
$ sudo apt install bear
$ make clean
$ bear -- make qemu # 之后直接按 ctrl-a x 退出即可生成
同时添加 ~/.clang-format
文件,其中需要设置 SortIncludes: false
,防止编译报错。
GDB 调试
两个终端调试
首先让 gdb 启动时加载 .gdbinit
文件:
$ echo "add-auto-load-safe-path ~/xv6-labs-2020/.gdbinit" >> ~/.gdbinit
之后在一个终端中
$ make qemu-gdb
另一个终端
$ gdb-multiarch
之后就可以调试了,例如调试 ls
程序,就是
file user/_ls
b main
c
VSCode 调试
首先注释掉 .gdbinit
中 target remote 127.0.0.1:26000
一行,防止 VSCode 配置和这个重复。之后创建 .vscode
下的
launch.json
:
{
"version": "0.2.0",
"configurations": [
{
"name": "xv6debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/kernel/kernel",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"miDebuggerServerAddress": "127.0.0.1:26000",
"miDebuggerPath": "gdb-multiarch",
"MIMode": "gdb",
}
]
}
之后在终端 make qemu-gdb
,并在 VSCode 左侧工具栏选择 "Run and Debug",左上角选取 "xv6debug",并点绿色的运行按钮,即可在 VSCode 里调试内核代码。
此时在用户态代码打断点还无法调试,为了调试用户态代码,需要在 DEBUG CONSOLE(调试控制台)中载入对应的文件。例如,如果要调试 user/ls.c
,输入 -exec file user/_ls
即可。
参考链接
make qemu on xv6-riscv gets stucked at qemu-system-riscv64 ... command - Stack Overflow
xv6 - qemu-system-riscv64 is not found in package qemu-system-misc - Stack Overflow
新机器上手指南(新手向) | TS 的十三小屋 (taylover2016.github.io)
6.S081 的调试和 VSCode 环境配置 | 止息的博客 (zhangjk98.xyz)
Fall2020/6.S081-如何在 QEMU 中使用 gdb - 知乎 (zhihu.com)