xv6 Book Repository
- xv6-book based on x86 ISA:https://pdos.csail.mit.edu/6.828/2018/xv6/
- xv6-book based on RISC-V ISA:https://pdos.csail.mit.edu/6.828/2020/xv6/
由上面的 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.pdf 和 xv6-riscv-rev1.pdf 的内容,看一看哪些概念是 OS 的不变量,哪些概念是基于「指令集」的定制化与设计考量。只在一种「指令集」下考察 OS kernel 的代码,容易让我们陷入思维定式,无法意识到很多的「设计取舍」都必须跟随 hardware 的变化而变化。
可以说,xv6 的「指令集」切换,为进一步深入学习 OS 与 hardware 的关系,提供了绝佳的契机。
QEMU doc:https://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、安装 qemu 和 x86_64-elf-gcc(之前的名称为:i386-elf-gcc,GNU compiler collection for x86_64-elf):
brew install qemu x86_64-elf-gcc
2、导出环境变量 TOOLPREFIX 和 QEMU。例如,打开 ~/.zshrc
文件,添加内容:
export TOOLPREFIX=x86_64-elf-
export QEMU=qemu-system-i386
3、切换到 git clone 到本地的 xv6-public 目录(注意到修复「QEMU hangs in “Booting from Hard…”」的 PR, 保证 clone 的 xv6 的版本在 Aug 11, 2020 之后 ),按如下命令 build:
make qemu
此时,即可看到 QEMU 和 terminal 呈现出相同内容(左边为 qemu,右边为 native terminal):
编译完成。
Build xv6-riscv on macOS Big Sur (11.0+)
Ref:
1、安装 qemu 和 riscv-tools :
brew tap riscv/riscv
brew install riscv-tools
brew install qemu
将 riscv-gnu-toolchain 添加到 PATH 环境变量:
export PATH=$PATH:/usr/local/opt/riscv-gnu-toolchain/bin
验证上述 package 是否安装成功:
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ qemu-system-riscv64 --version
QEMU emulator version 5.2.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
2、修改 Makefile,将注释的 TOOLPREFIX 修改为:
TOOLPREFIX = riscv64-unknown-elf-
3、切换到 git clone 到本地的 xv6-riscv 目录,使用如下命令编译:
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
,得到如下结果:
可以看到,此时监听的端口为:25501 .
重新打开另一个 terminal,同样进入到 xv6-riscv 的根目录,运行: gdb kernel
,gdb 会自动连接到对应的 port,得到如下结果:
继续在这个 terminal 下,输入 break *0x3ffffff10e
,得到:
继续输入 continue
,得到 Exercise 2.8 期望的结果:
继续输入 stepi
,得到 Exercise 2.8 期望的结果: