Skip to content
On this page

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 时,卡在

    bash
    qemu-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:

bash
$ sudo apt update
$ sudo apt install zsh
$ chsh -s /bin/zsh

重启后再连接,echo $SHELL 发现已经变成 zsh。

bash
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

装上后 ~/.zshrc 有一百多行,去掉注释只有:

bash
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

bash
$ sudo apt install zsh-antigen

查了很多文档都没发现 antigen.zsh 在哪,只能

bash
$ sudo find / | grep antigen.zsh

发现在 /usr/share/zsh-antigen/antigen.zsh

~/.zshrc 改成:

bash
source /usr/share/zsh-antigen/antigen.zsh
antigen init ~/.antigenrc

新建 ~/.antigenrc

bash
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:

bash
$ 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 里加上:

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

内容为

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

bash
$ sudo apt install bear
$ make clean
$ bear -- make qemu # 之后直接按 ctrl-a x 退出即可生成

同时添加 ~/.clang-format 文件,其中需要设置 SortIncludes: false,防止编译报错。

GDB 调试

两个终端调试

首先让 gdb 启动时加载 .gdbinit 文件:

bash
$ echo "add-auto-load-safe-path ~/xv6-labs-2020/.gdbinit" >> ~/.gdbinit

之后在一个终端中

bash
$ make qemu-gdb

另一个终端

bash
$ gdb-multiarch

之后就可以调试了,例如调试 ls 程序,就是

file user/_ls
b main
c

VSCode 调试

首先注释掉 .gdbinittarget remote 127.0.0.1:26000 一行,防止 VSCode 配置和这个重复。之后创建 .vscode 下的

launch.json

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)

MIT 6.S081 xv6 调试不完全指北 - KatyuMarisa - 博客园 (cnblogs.com)

从零开始使用 Vscode 调试 XV6 - 知乎 (zhihu.com)