《操作系统》课程概述
操作系统是一个典型的 “system”——它完成对计算机硬件系统的抽象 ,为应用程序提供运行的支持。我们的课程从三个视角观察操作系统:
从应用程序的视角看,操作系统定义了一系列的对象 (进程/线程、地址空间、文件、设备……) 和操纵它们的 API (系统调用)。这组强大的 API 把一台计算机的硬件资源分享给操作系统中的所有应用程序。我们看到的一切程序,不限于浏览器、游戏,甚至还包括容器、虚拟机、调试器、游戏外挂,都是在系统调用 API 上实现的。
从硬件的视角看,操作系统是一个拥有访问全部硬件功能的程序 (操作系统就是个 C 程序,不用怕)。硬件会帮助操作系统完成最初的初始化和加载,之后,操作系统加载完第一个程序后,从此作为 “中断处理程序” 在后台管理整个计算机系统。
从数学的视角看,一切计算机系统都是如同 “1 + 1 = 2” 一样 “well-defined” 的数学对象 ,这包括机器、程序,当然也包括操作系统。计算机系统的行为是可以用数学函数 (当然,也可以用代码) 表示的。
课程组织
在这一次新的课程建设中,我们希望为同学们呈现一门编程课 ,每一节课都带着一个明确的,希望 “实现一点什么” 的目标,每节课都学会一类新的软件系统的实现原理,从而建立对 “操作系统是什么” 的感性认识:课堂以 “应用视角的操作系统” 为主,讲解操作系统中的对象和 API,但特别侧重 “我们能用这些机制做什么”,例如在 Linux 中复刻三类经典游戏外挂:金山游侠、按键精灵、变速齿轮,并用它们修改真正的游戏;我们也会构建操作系统的可执行模型,并用形式化方法 “暴力枚举” 操作系统上程序的所有可能行为以更好地理解操作系统 (USENIX ATC'23 Paper )。
课程中不再讲述内核是如何实现,但参考书 “Operating System: Three Easy Pieces” 就成了查漏补缺的绝佳课后读物,藏着许多惊喜。如果学完这门课,同学们对操作系统实现很感兴趣,可以选修其他课程 (例如 6.1810 )。
我们的课程也不再是 “闻风丧胆” 的折磨实验,本学期所有实验都是 Mini labs,通过实现一系列有趣的 (黑科技) 代码理解操作系统中对象存在的意义和操作系统 API 的使用方法、设计理念;没有内核实验,没有模拟器。这是一门编程课。
❓ 一个违背祖宗的决定? 这还是操作系统课吗?哈哈,是的。即便这样教,我们同样也可以 (甚至更容易) 对计算机系统作出深入思考。作为例子,历年的试卷多多少少都会有一些 “彩蛋”。2023 年期末试题中提问 “如何在没有 MMU,不支持虚拟地址空间的计算机系统上实现 fork 的功能?” 这些思考最终将指向严肃的研究工作 (PLDI'20 Paper )——即便课堂不讲操作系统内核,可以问出完全相同的问题:如果你只能使用 POSIX 线程库,要想实现 fork() API 的功能,需要编程语言做出怎样的辅助?
前导知识
只要会写代码就可以啦!与往年课程不同,你不再需要熟悉指令集体系结构 。但你依然应该有相当的代码能力,包括正确使用大语言模型、独立排查问题和在互联网查阅资料的能力,能够处理一定规模的代码。因此,我们也不需要生存指南了!
💬 Prompt: 我是一位选修这门课的同学,应该怎样学好这门课? (多轮对话后) deepseek-r1 : ▶️