名校公开课 / 麻省理工 / 经典

操作系统工程

Operating System Engineering6.1810 / 6.S081麻省理工Fall 2020(视频)免费
系统调用虚拟内存中断与陷入并发与锁文件系统

这门课学什么

这门课用 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. 1
    导论与示例Introduction and examples

    介绍操作系统的作用,用 shell 和 Unix 系统调用的小程序说明内核提供的接口。

  2. 2
    C 语言与 gdbC and gdb

    复习 C 语言的指针和位运算,演示怎样用 gdb 调试 xv6。

  3. 3
    操作系统组织与系统调用OS organization and system calls

    讲宏内核和微内核的区别、用户态和内核态的隔离,以及 xv6 的启动过程。

  4. 4
    页表Page tables

    讲 RISC-V 的三级页表,以及 xv6 内核和用户进程的地址空间布局。

  5. 5
    RISC-V 调用约定与栈帧Calling conventions and stack frames RISC-V

    讲 RISC-V 汇编、寄存器使用约定和函数调用时的栈帧结构。

  6. 6
    隔离与系统调用的进出Isolation & system call entry/exit

    跟踪一次系统调用从用户态陷入内核、再返回用户态的完整路径。

  7. 7
    实验答疑Q&A labs

    讲解前几个实验的参考解法和常见错误。

  8. 8
    缺页异常Page faults

    讲怎样利用缺页异常实现惰性分配、写时复制和按需调页。

  9. 9
    中断Interrupts

    讲设备中断的处理流程,以 UART 控制台驱动为例说明驱动的结构。

  10. 10
    多处理器与锁Multiprocessors and locking

    讲竞争条件和自旋锁的实现,以及锁带来的死锁和性能问题。

  11. 11
    线程切换Thread switching

    讲 xv6 怎样在内核线程之间切换上下文,以及调度器的结构。

  12. 12
    实验答疑Q&A labs

    讲解惰性分配和写时复制实验的参考解法。

  13. 13
    sleep 与 wakeupsleep & wakeup and code

    讲条件同步和丢失唤醒问题,并逐行分析 xv6 的 sleep 和 wakeup 代码。

  14. 14
    文件系统File systems

    讲 xv6 文件系统的分层结构:磁盘块、inode、目录和路径名。

  15. 15
    崩溃恢复Crash recovery

    讲怎样用预写日志保证文件系统在崩溃后保持一致。

  16. 16
    文件系统性能与快速崩溃恢复File system performance and fast crash recovery

    以 Linux ext3 的日志设计为例,讲批量提交和并发日志怎样提升性能。

  17. 17
    面向应用的虚拟内存Virtual memory for applications

    讲应用程序怎样利用页保护和缺页处理实现垃圾回收这类功能。

  18. 18
    操作系统组织OS organization

    以 L4 微内核的性能论文为例,比较微内核和宏内核的设计取舍。

  19. 19
    虚拟机Virtual machines

    讲陷入并模拟的虚拟化方法和硬件虚拟化支持,以及 Dune 怎样把这些硬件特性交给普通进程使用。

  20. 20
    内核与高级语言Kernels and HLL

    以 Biscuit 为例,讨论用带垃圾回收的 Go 语言写内核的代价和收益。

  21. 21
    网络Networking

    讲网络协议栈的分层结构,以及中断过多造成的接收活锁问题。

  22. 22
    Meltdown 漏洞Meltdown

    讲 CPU 推测执行怎样泄露内核内存,以及内核为此做的隔离修补。

  23. 23
    RCU 读-复制-更新RCU

    讲 Linux 怎样用 RCU 让读者不加锁,以及写者怎样安全回收旧数据。

  24. 24
    期末答疑Q&A

    回答学生关于实验和课程内容的问题。

麻省理工的其他经典课