1 课程简介
MIT6.S081 Operating System Engineering 是麻省理工学院的 PDOS
实验室开设的面向MIT本科生的操作系统课程, 课程前身为MIT6.828。课程主题是介绍 基于 RISCV 架构实现的类Unix OS xv6
, 基本上每一部分的内容都有对应的xv6 lab
, 涉及页表、中断、内存管理、线程调度、锁、文件系统等OS的基本内容。课程附有专门的教材介绍xv6
的设计架构, 并结合了与通用操作系统的比较和相应前沿技术的简单介绍。
2 资源汇总
- 课程官网:
2020秋: https://pdos.csail.mit.edu/6.828/2020/schedule.html
2021秋: https://pdos.csail.mit.edu/6.828/2021/schedule.html - 中文参考文献
课程内容翻译(2020秋): https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/
xv6中文文档(版本较旧): https://th0ar.gitbooks.io/xv6-chinese/content/index.html - 教材、lab指导书、视频、ppt等资源
见官网
3 环境配置
官网的环境配置参考为: https://pdos.csail.mit.edu/6.828/2020/tools.html
我的方案是在 Windows11 wsl2
中进行环境配置
3.1 wsl2安装Ubuntu22.04
wsl2的安装参考 微软官方文档
3.1.1 启用Linux子系统功能
系统搜索启用或关闭Windows功能,如下图开启功能
3.1.2 BIOS开启CPU虚拟化功能
不同的主板厂商BIOS界面设置不同,大体上的位置可参考下图
3.1.3 安装wsl2
最好以管理员模式打开powershell,输入如下命令进行安装
1 | wsl -l -o |
默认安装Ubuntu20.04
1 | wsl --install |
或安装指定版本
1 | wsl --install -d Ubuntu-20.04 |
如果使用了Windows Terminal,其选项卡中会自动添加安装的Linux发行版
也可以使用powershell进入虚拟机:
1 | wsl -d Ubuntu |
3.1.4 Ubuntu换源
1 | sudo vim /etc/apt/sources.list |
将其替换为如下内容
1 | # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
然后更新源
1 | sudo apt-get update |
3.2 安装riscv交叉编译工具和qemu
3.2.1 安装riscv交叉编译工具
1 | $ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu |
3.2.2 编译安装qemu
官网指定版本为qemu-5.1.0
1 | $ cd qemu-5.1.0 |
3.3 安装gdb
按照指导书进行环境配置对于基础的代码运行是没有问题,但我发现自己按照指导书操作后无法进行gdb
调试, 经过总结后在此处给出我的2种解决方案:
方案1: 安装完整的 riscv-gnu-toolchain
安装完整的riscv-gnu-toolchain
流程如下, 次方法费时较长, 且占据空间较大, 更推荐第二种方法。
- 安装依赖
1
$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
- 克隆
riscv-gnu-toolchain
1
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
- 编译安装
1
2
3$ cd riscv-gnu-toolchain
$ ./configure --prefix=/usr/local
$ sudo make
方案2: 编译安装 riscv64-unknown-elf-gdb
- 安装依赖
1
$ sudo apt-get install libncurses5-dev python2 python2-dev texinfo libreadline-dev
- 下载
gdb
源码
此处我选择gdb-13.1, 该版本在wsl2 Ubuntu22.04
上使用正常。1
2
3
4# 推荐清华源下载
$ wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/gdb-13.1.tar.xz
# 解压
$ tar -xvf gdb-13.1.tar.x - 编译安装
只需要指定编译安装riscv64-unknown-elf
并配置相关参数。1
2
3
4
5$ cd gdb-13.1
$ mkdir build && cd build
$ ../configure --prefix=/your_path --target=riscv64-unknown-elf --enable-tui=yes
$ make -j$(nproc)
$ sudo make install
4 测试
4.1 克隆仓库
1 | $ git clone git://g.csail.mit.edu/xv6-labs-2020 |
4.2 第一次运行前设置gdbinit
/.gdbinit 是 GNU 调试器(GDB)的一个配置文件,它位于用户的主目录中。当 GDB 启动时,它会自动读取这个文件(如果存在的话),并执行文件中的命令。这允许用户自定义 GDB 的启动行为,包括设置断点、定义宏、修改显示格式等。
在 ~/.gdbinit 文件中,用户可以编写 GDB 命令脚本,这些脚本在每次启动 GDB 时自动执行。这可以极大地提高调试效率,尤其是对于那些需要频繁调试并希望每次调试会话都有一组固定设置的用户来说。
按照指导, 我们如下进行设置:
1 | echo set auto-load safe-path / >> ~/.gdbinit |
4.3 启动qemu调试
在一个终端的xv6仓库下:
1 | $ make qemu-gdb |
在另一个终端的xv6仓库下:
1 | $ riscv64-unknown-elf-gdb |
结果如图所示
进行断点调试, 例如指定函数uvmalloc
断点:
可以看出, 运行ls
程序后, 程序停留在了uvmalloc
函数的入口处, 证明了gdb调试功能正常。