官方课程资源:6.S081/2023/schedule
视频教程:MIT 公开课 MIT6.S081精译
视频教程的文字版:GitHub - huihongxiao/MIT6.S081 或者 网页阅读
中文资料: CS自学指南-6.S081
可参考的其他资料:
好的RISCV的资料网站: five-embeddev
环境搭建
主要包括编译工具链,qemu,gdb以及依赖的各种工具库。
gdb-multiarch无法单步调试ecall进入内核,这个问题没有找到解决办法。
于是自己编译安装riscv64-unknown-elf-gdb。参考1、参考2
如果自己安装工具链, 过程参考6.S081/2023/tools、汪辰老师的博客或者这个博客。
环境测试:
在工程主目录下,执行make qemu开始编译代码,并开始运行qemu,进入xv6的命令行。Ctrl A+X可退出xv6的命令行。
make qemu-gdb,并在另一个窗口(也需要在工程主目录下),执行riscv64-unknown-elf-gdb,可使用GDB调试xv6的代码。工程主目录下,有.gdbinit的文件,启动GDB时,会自动执行该脚本中的命令,比如加载被调试文件的命令。
运行xv6
运行 xv6:在 xv6-riscv 目录下,输入 make qemu。
退出xv6
如果你想退出 xv6,有两种方式可以实现:
-
直接终止 QEMU 进程:
- 按下 Ctrl + a,然后再按下 x。这将直接终止 QEMU 进程,并将你带回到 shell 界面。
-
先回到QEMU的console界面,然后再退出:
- 按下 Ctrl + a,然后再按下 c。这将退出 xv6 的 shell 界面,进入 QEMU 的监视器界面。
- 在监视器界面中,输入 q 并按回车键,即可完全退出 QEMU。
QEMU的console界面
-
进入: 按下 Ctrl + a,然后再按下 c。这将退出 xv6 的 shell 界面,进入 QEMU 的监视器界面。
-
返回 xv6 的 shell 界面: 在 QEMU 的监视器界面按下,Ctrl + a,然后再按下 c。可返回 xv6 的 shell 界面。
console界面的常用命令:
info mem查看页表。
调试xv6
- 在 xv6-riscv 目录下执行
make qemu-gdb,进程会阻塞。 - 另开一个终端,在 xv6-riscv 目录下执行
riscv64-unknown-elf-gdb。 - 如果出现
.gdbinit相关的错误,将add-auto-load-safe-path /home/xxx/xv6-riscv/.gdbinit添加到/home/xxx/.gdbinit文件中。xv6-riscv 下,有.gdbinit的文件,启动GDB时,会自动执行该脚本中的命令,比如加载被调试文件的命令。 - 如果调试用户态程序,则需要再手动加载用户态程序。如:在lab4中,需要调试call.c,启动gdb后,需要执行
file user/_call。