《操作系统》课程概述
什么是操作系统?
操作系统是一个典型的 “system”——它完成对计算机硬件系统的
- 从应用程序的视角看,操作系统定义了一系列的对象 (进程/线程、地址空间、文件、设备……) 和操纵它们的 API (系统调用)。这组强大的 API 把计算机的硬件资源有序地管理起来,它不仅能实现应用程序 (浏览器、游戏……),还支持着各类神奇的系统程序 (容器、虚拟机、调试器、游戏外挂……)
- 我们会使用操作系统 API 实现一系列 “黑科技”,包括在 Linux 中复刻三类经典游戏外挂:金山游侠、按键精灵、变速齿轮,并用它们修改真正的游戏
- 从硬件的视角看,操作系统是一个拥有访问全部硬件功能的程序 (操作系统就是个 C 程序,不用怕)。硬件会帮助操作系统完成最初的初始化和加载,之后,操作系统加载完第一个程序后,从此作为 “中断处理程序” 在后台管理整个计算机系统
- 我们会在课堂上调试 xv6 和 Linux 内核,理解真实操作系统的执行
课程组织
操作系统使用正确的抽象使构造庞大的计算机软件/硬件生态从不可能变为可能。这门课围绕操作系统是
- 原理课 (并发/虚拟化/持久化):以教科书内容为主,介绍操作系统的原理性内容。课程同时注重讲解操作系统相关的代码实现和编程技巧,包括操作系统中常用的命令行/代码工具、教学操作系统 xv6 的代码讲解等
- 理解操作系统最重要的实验部分
- Mini labs (应用程序视角;设计):通过实现一系列有趣的 (
黑科技) 代码理解操作系统中对象存在的意义和操作系统 API 的使用方法、设计理念 - OS labs (计算机硬件视角;实现):基于一个简化的硬件抽象层实现多处理器操作系统内核,向应用程序提供一些基础操作系统 API
- Mini labs (应用程序视角;设计):通过实现一系列有趣的 (
前导知识
这是一门强调 “编程” 的硬核课程。不畏惧且能够写出能够正确工作的代码对理解操作系统来说至关重要的:
Talk is cheap. Show me the code. ——Linus Torvalds
因此,我们预期这门课的听众已经能够在操作系统上利用 API 编程,并对计算机硬件提供的机制有一定了解。具体来说,我们假设课程的听众:
- 掌握 C 语言编程的技术和技巧,包括一定规模代码的编写、测试方法和调试工具的使用方法
- 熟悉至少一个指令集体系架构 (包括应用和系统指令),如 x86/MIPS/RISC-V 中的一个
注意我们对上述两个要求是真正的 “严格” 的,例如独立完成《计算机系统基础》课程中附带的 NEMU 模拟器实验实现可以满足此要求。同时,这意味着你应该有相当的代码能力,包括独立排查问题和在互联网查阅资料的能力。如果你觉得自己的编程基础还没能过关 (例如调试中等规模代码时找不到头绪),请参考我们准备的生存指南。