操作系统工程
这门课学什么
这门课用 xv6 讲操作系统。xv6 是一个运行在 RISC-V 上的小型类 Unix 教学内核。内容包括系统调用、页表、陷入、写时复制、锁、调度、文件系统和网卡驱动,每个主题都有一个改内核的实验。
内容摘要
这门课用 xv6 讲操作系统内核。xv6 是运行在 RISC-V 上的小型类 Unix 教学内核,代码只有几千行,可以从头读到尾。2020 年秋季版由莫里斯(Robert Morris)和卡舒克(Frans Kaashoek)讲授,当时编号是 6.S081,现在编号是 6.1810。
课程分 3 段。第 1 段(第 1–9 讲)讲系统调用、操作系统组织、页表、RISC-V 调用约定、陷入(trap)、缺页异常和中断。第 2 段(第 10–17 讲)讲多处理器和锁、线程切换、sleep 与 wakeup、文件系统、崩溃恢复和面向应用的虚拟内存。第 3 段(第 18–24 讲)以研究论文为主,讨论微内核、虚拟机、用高级语言写内核、网络、Meltdown 漏洞和 RCU。
作业是 11 个实验,几乎每周 1 个。学生要在 xv6 上写 Unix 工具、添加系统调用、修改页表、实现惰性分配、写时复制 fork 和用户级线程,再优化锁、扩展文件系统、实现 mmap,最后写一个网卡驱动。每讲之前还要读 xv6 教材的一章或一篇论文,并回答一个问题。
学完以后,你能读懂内核代码,能用 gdb 调试内核,能说清进程、虚拟内存、并发和文件系统在底层怎样实现。这些能力是读 Linux 源码和做系统研究的基础。
讲课常直接打开 xv6 源码或 gdb 现场演示。其中 3 讲是答疑课,讲解实验的参考解法。2020 年秋季全部课程通过 Zoom 远程授课。
为什么值得学
读懂并改写一个完整的小内核,是真正理解操作系统的最快路径。很多大学都用 xv6 实验教学。
课程信息
- 学校
- 麻省理工(MIT)
- 课程号
- 6.1810 / 6.S081
- 讲师
- 罗伯特·莫里斯(Robert Morris)、弗兰斯·卡舒克(Frans Kaashoek)
- 学期
- Fall 2020(视频)
- 平台
- 课程官网
- 费用
- 免费
- 难度
- 中级
- 学时
- 24 讲(6.S081 Fall 2020)
- 先修
- 学过计算机系统基础,会 C 语言。
- 材料
- 视频、讲义、作业、教材、代码
- 许可证
- CC BY 3.0 US
课程大纲 · 共 24 节
大纲依据:6.S081 Fall 2020 课程表(24 讲,与讲座视频一致)(查看原始页面 ↗)
- 1导论与示例Introduction and examples
介绍操作系统的作用,用 shell 和 Unix 系统调用的小程序说明内核提供的接口。
- 2C 语言与 gdbC and gdb
复习 C 语言的指针和位运算,演示怎样用 gdb 调试 xv6。
- 3操作系统组织与系统调用OS organization and system calls
讲宏内核和微内核的区别、用户态和内核态的隔离,以及 xv6 的启动过程。
- 4页表Page tables
讲 RISC-V 的三级页表,以及 xv6 内核和用户进程的地址空间布局。
- 5RISC-V 调用约定与栈帧Calling conventions and stack frames RISC-V
讲 RISC-V 汇编、寄存器使用约定和函数调用时的栈帧结构。
- 6隔离与系统调用的进出Isolation & system call entry/exit
跟踪一次系统调用从用户态陷入内核、再返回用户态的完整路径。
- 7实验答疑Q&A labs
讲解前几个实验的参考解法和常见错误。
- 8缺页异常Page faults
讲怎样利用缺页异常实现惰性分配、写时复制和按需调页。
- 9中断Interrupts
讲设备中断的处理流程,以 UART 控制台驱动为例说明驱动的结构。
- 10多处理器与锁Multiprocessors and locking
讲竞争条件和自旋锁的实现,以及锁带来的死锁和性能问题。
- 11线程切换Thread switching
讲 xv6 怎样在内核线程之间切换上下文,以及调度器的结构。
- 12实验答疑Q&A labs
讲解惰性分配和写时复制实验的参考解法。
- 13sleep 与 wakeupsleep & wakeup and code
讲条件同步和丢失唤醒问题,并逐行分析 xv6 的 sleep 和 wakeup 代码。
- 14文件系统File systems
讲 xv6 文件系统的分层结构:磁盘块、inode、目录和路径名。
- 15崩溃恢复Crash recovery
讲怎样用预写日志保证文件系统在崩溃后保持一致。
- 16文件系统性能与快速崩溃恢复File system performance and fast crash recovery
以 Linux ext3 的日志设计为例,讲批量提交和并发日志怎样提升性能。
- 17面向应用的虚拟内存Virtual memory for applications
讲应用程序怎样利用页保护和缺页处理实现垃圾回收这类功能。
- 18操作系统组织OS organization
以 L4 微内核的性能论文为例,比较微内核和宏内核的设计取舍。
- 19虚拟机Virtual machines
讲陷入并模拟的虚拟化方法和硬件虚拟化支持,以及 Dune 怎样把这些硬件特性交给普通进程使用。
- 20内核与高级语言Kernels and HLL
以 Biscuit 为例,讨论用带垃圾回收的 Go 语言写内核的代价和收益。
- 21网络Networking
讲网络协议栈的分层结构,以及中断过多造成的接收活锁问题。
- 22Meltdown 漏洞Meltdown
讲 CPU 推测执行怎样泄露内核内存,以及内核为此做的隔离修补。
- 23RCU 读-复制-更新RCU
讲 Linux 怎样用 RCU 让读者不加锁,以及写者怎样安全回收旧数据。
- 24期末答疑Q&A
回答学生关于实验和课程内容的问题。