xv6 Book Repository

由上面的 url 可以看到,从 2019 年开始,mit6.828 提供的 xv6 就开始切换到基于 RISC-V 指令集的代码库、book writing(2019 年提供的是 xv6-riscv-rev0.pdf,而 2020 年提供的是 xv6-riscv-rev1.pdf)。

「指令集」从 Intel x86 切换到 RISC-V 为我们提供了更多的视角来考察 OS 和 hardware 的关系。如此,研究 xv6 的更好的方式,是同时比对 xv6-public-rev11.pdfxv6-riscv-rev1.pdf 的内容,看一看哪些概念是 OS 的不变量,哪些概念是基于「指令集」的定制化与设计考量。只在一种「指令集」下考察 OS kernel 的代码,容易让我们陷入思维定式,无法意识到很多的「设计取舍」都必须跟随 hardware 的变化而变化。

可以说,xv6 的「指令集」切换,为进一步深入学习 OS 与 hardware 的关系,提供了绝佳的契机。

QEMU dochttps://qemu-project.gitlab.io/qemu/system/quickstart.html


Build xv6-public on macOS Big Sur (11.0+)

由于 xv6 中所使用的 C 并非是 ISO C,而是 GNU C(可根据 gcc 的官方文档 或者 GNU C manual 来查看细节)。因此,必须要在非 Linux 平台(如 macOS)上安装对应的 GNU compiler collection 的 cross-platform 支持。

1、安装 qemux86_64-elf-gcc(之前的名称为:i386-elf-gcc,GNU compiler collection for x86_64-elf):

  1. brew install qemu x86_64-elf-gcc

2、导出环境变量 TOOLPREFIX 和 QEMU。例如,打开 ~/.zshrc 文件,添加内容:

  1. export TOOLPREFIX=x86_64-elf-
  2. export QEMU=qemu-system-i386

3、切换到 git clone 到本地的 xv6-public 目录(注意到修复「QEMU hangs in “Booting from Hard…”」的 PR, 保证 clone 的 xv6 的版本在 Aug 11, 2020 之后 ),按如下命令 build:

  1. make qemu

此时,即可看到 QEMU 和 terminal 呈现出相同内容(左边为 qemu,右边为 native terminal):
image.png

编译完成。


Build xv6-riscv on macOS Big Sur (11.0+)

Ref:

1、安装 qemuriscv-tools

  1. brew tap riscv/riscv
  2. brew install riscv-tools
  3. brew install qemu

riscv-gnu-toolchain 添加到 PATH 环境变量:

  1. export PATH=$PATH:/usr/local/opt/riscv-gnu-toolchain/bin

验证上述 package 是否安装成功:

  1. $ riscv64-unknown-elf-gcc --version
  2. riscv64-unknown-elf-gcc (GCC) 10.2.0
  3. Copyright (C) 2020 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions. There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  6. $ qemu-system-riscv64 --version
  7. QEMU emulator version 5.2.0
  8. Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers

2、修改 Makefile,将注释的 TOOLPREFIX 修改为:

  1. TOOLPREFIX = riscv64-unknown-elf-

3、切换到 git clone 到本地的 xv6-riscv 目录,使用如下命令编译:

  1. make qemu

退出 xv6:向 qemu 发送命令 Ctrl-a x (注意第一个 a 需要「同时按住」Ctrl 键;而第二个 x 键需要「松开」Ctrl 键)。


GDB Remote Debug

http://www.cs.columbia.edu/~junfeng/11sp-w4118/tools.html#gdb

进入到 xv6-riscv 的根目录,运行: make qemu-gdb ,得到如下结果:
image.png
可以看到,此时监听的端口为:25501 .

重新打开另一个 terminal,同样进入到 xv6-riscv 的根目录,运行: gdb kernel ,gdb 会自动连接到对应的 port,得到如下结果:
image.png

继续在这个 terminal 下,输入 break *0x3ffffff10e ,得到:
image.png

继续输入 continue ,得到 Exercise 2.8 期望的结果:
image.png

继续输入 stepi ,得到 Exercise 2.8 期望的结果:
image.png