6.s081 总结
Lab 完成情况
- 除了 cowlab 没有通过 usertests, 其余实验均通过了所有测试。希望后续能补上
- 用时最长的三个实验 Lab1 utils (5天)
一开始是真的不习惯unix的api风格😢 , Lab5 COW (20h), Lab10 mmap(14h)
课程介绍
-
6.s081 是 MIT 大二学生选修的一门操作系统课程。这门课程依托于 XV6 (一个 MIT 研发的小型类 Unix 操作系统) 讲解操作系统, 通过理解 XV6 的代码来理解操作系统是如何构建,如何工作的。
-
课程的前15节课主要讲解的是 XV6 的各个组成部分的代码实现,后七节课程则是论文课,每节课讲解一篇 paper, 让你了解操作系统这个领域的发展前沿。
-
如果你赶时间,只是想完成 lab 或者听不下去英文授课的话,你可以直接学习 XV6 的官方手册 和 XV6的源代码。因为前15节课老师也就是讲解一下 XV6 的代码实现,和你自己看手册、代码效果是一样的。
如果能消化的话不过视频中老师有时会魔改XV6 写一些小 demo 来加深理解,以及会回答学生的疑问。如果你不想错过这些部分的话,那我推荐你看一下这个 仓库。它将 081 的所有lecture 整理成了文本并进行了翻译。同时,文本中也包含了视频中关键的图像,比如教授展示的代码,或者绘制的图解。
感悟
实验有局限性
- 实验的代码量并不是很大,单个实验最多也就 一百来行代码。可以说是在 XV6 这个框架下 进行一个程序填空。不过虽然代码量不大,要写的正确还是很难的。每一个实验的handout 在最开始都会说明实验的前置要求,比如 需要看完 chapter x.x - x.x 的内容再开始。只用将这些代码理解了再开始实验,才不会像无头苍蝇一样茫然。
- 由于 XV6 本身的实现比较简单,很多结构做了简化处理。而且大部分情况下我们只是在做程序填空,距离真正的理解现代操作系统还是有很大距离。
所以不要妄自菲薄前面的路还很长。这个课程只是入门。
好的工具是开始的第一步
任何 tedious 的工作都能被简化 by jyy
-
在写 lab util 的时候,我是在 wsl (ubuntu) 下完成的。虽然课程官网给出了配置环境所需要的命令,但是我在完成实验的过程总是遇到奇奇怪怪的问题。比如我的 gdb 调试界面没有 syntax highligh, 与视频里的 调试界面天差地别。
这也是我在写第一个实验的时候总想摆烂的原因(之后意识到应该是 apt 安装的软件版本过低了)。
之后,我把系统切换到了 manjaro, 什么毛病也没了🤤 。 manjaro 配置环境请参考 -
在进行调试的时候,我们总是需要在一个终端里输入
make CPUS=1 qemu-gdb
, 另一个中断输入riscv64-linux-gnu-gdb
。这样怪麻烦的。我的解决方式是安装一个zellij
, 这个命令行工具可以自定义终端布局,并且指定终端执行的命令。layout { pane split_direction="vertical" { pane { size "50%" cwd "/home/trace/trace/learning/open_course/6.s081/xv6-labs-2021" command "make" args "CPUS=1" "qemu-gdb" } pane { size "50%" focus true cwd "/home/trace/trace/learning/open_course/6.s081/xv6-labs-2021" command "riscv64-linux-gnu-gdb" } } }
- 配置一个好用的编辑器。无论是 vim 还是 vscode, 熟练使用一个编辑器可以让你在写代码时,达到一种心流的状态。 (安利一下 neovim 真心好用)
如何学习一个codebase
XV6 总共代码两万多行,也算是个中小型项目了。一开始,面对这样庞大的 codebase, 不知道从那一个地方入手。我觉的可以参考一下知乎这位 dalao 的做法 link
扫读在课程表上重点指出的几个xv6源代码文件. 一般来说每节课也就1, 2个源文件, 量不大. 在这个阶段, 主要是看代码文件里不同函数的呼叫依赖, 对于具体怎么实现的可以先放一下. 争取做到在阅读完后, 对于一个相关功能, 能在心中大致说出它的一个函数呼叫链, 比如 a() -> b() -> c() -> a().
如何更好的进行调试
参考jyy的调试理论
画饼
- 参考 降星驰 , 将 xv6 启动过程,以及核心模块的函数调用关系,核心数据结构用图解的形式绘制出来。
- 结合 osetp 完整的 看一遍蒋老师的操作系统课程。