《操作系统》课程概述

操作系统是一个典型的 “system”——它完成对计算机硬件系统的抽象,为应用程序提供运行的支持。我们的课程从三个视角观察操作系统:

  • 从应用程序的视角看,操作系统定义了一系列的对象 (进程/线程、地址空间、文件、设备……) 和操纵它们的 API (系统调用)。这组强大的 API 把一台计算机的硬件资源分享给操作系统中的所有应用程序。我们看到的一切程序,不限于浏览器、游戏,甚至还包括容器、虚拟机、调试器、游戏外挂,都是在系统调用 API 上实现的 在课程中,我们使用操作系统 API 实现一系列 “黑科技”,包括在 Linux 中复刻三类经典游戏外挂:金山游侠、按键精灵、变速齿轮,并用它们修改真正的游戏
  • 从硬件的视角看,操作系统是一个拥有访问全部硬件功能的程序 (操作系统就是个 C 程序,不用怕)。硬件会帮助操作系统完成最初的初始化和加载,之后,操作系统加载完第一个程序后,从此作为 “中断处理程序” 在后台管理整个计算机系统 在课堂中,我们会调试真实的操作系统内核。同学们也会编写属于自己的迷你操作系统内核,并实现简化的系统调用
  • 从数学的视角看,一切计算机系统都是如同 “1 + 1 = 2” 一样 “well-defined” 的数学对象,这包括机器、程序,当然也包括操作系统。计算机系统的行为是可以用数学函数 (当然,也可以用代码) 表示的 在课堂中,我们会构建操作系统的可执行模型,并用形式化方法 “暴力枚举” 操作系统上程序的所有可能行为以更好地理解操作系统 (USENIX ATC'23 Paper)

课程组织

我们会在课程中交替地从三个视角观察操作系统,最终建立对 “操作系统” 的正确认识。

  • 原理课:以教科书内容为主线,但从三个视角交替观察操作系统。课堂上将会展示许多代码示例,确保同学们理解真实的程序是如何在真实的操作系统上运行的
  • 课后阅读:“Operating System: Three Easy Pieces” 的思路 (并发/虚拟化/持久化) 和课堂略有不同,但无论如何,OSTEP 都是一本非常棒的课后读物,藏着许多惊喜,推荐每一位同学参考原理课内容阅读
  • 折磨实验
    • Mini labs (应用程序视角;设计):通过实现一系列有趣的 (黑科技) 代码理解操作系统中对象存在的意义和操作系统 API 的使用方法、设计理念
    • OS labs (计算机硬件视角;实现):基于一个简化的硬件抽象层实现多处理器操作系统内核,向应用程序提供一些基础操作系统 API

我们会在课程中讲授一些相对深刻和本质的内容,不要求同学们掌握,用 🌶️ 标记。同时,这些深刻的思考也体现在方方面面,例如历年的试卷多多少少都会有一些 “彩蛋”。2023 年期末试题中提问 “如何在没有 MMU,不支持虚拟地址空间的计算机系统上实现 fork?” 课堂和课后的思考都将指向严肃的研究工作 (PLDI'20 Paper)。如果你知道进程地址空间中存储的指针是问题的难点,就能想到合理的解决思路。

前导知识

这是一门强调 “编程” 的硬核课程。不畏惧且能够写出能够正确工作的代码对理解操作系统来说至关重要:

Talk is cheap. Show me the code. ——Linus Torvalds

因此,我们预期这门课的听众已经能够在操作系统上利用 API 编程,并对计算机硬件提供的机制有一定了解。具体来说,我们假设课程的听众:

  1. 掌握 C 语言编程的技术和技巧,能够驾驭一定规模 (数千行) 的代码,并且能为你自己的 “负责”,使用正确的工具完成测试、调试
  2. 熟悉至少一个指令集体系架构 (包括应用和系统指令),如 x86/MIPS/RISC-V 中的一个

注意我们对上述两个要求是真正的 “严格” 的,例如独立完成《计算机系统基础》课程中附带的 NEMU 模拟器实验实现可以满足此要求。同时,这意味着你应该有相当的代码能力,包括独立排查问题和在互联网查阅资料的能力。如果你觉得自己的编程基础还没能过关 (例如调试中等规模代码时找不到头绪),请参考我们准备的生存指南