写在前面:
这是一个全新的系列,记录我学习南京大学蒋炎岩老师《操作系统》课程的硬核之旅。
"把时间还给大家!" ------ 这门课不仅教底层原理,更在教我们如何在 AI 时代成为一个掌握工具的 Power User。

导言与课程概览
- 课程主页: https://jyywiki.cn/OS/2023/index.html
- 教材: Operating Systems...
- 实验: OS Lab
- 助教: 时代变了,如今我们的助教是 Kimi、GPT、DeepSeek、豆包等大语言模型。
- 内核说明: 本课程今年不再开设操作系统内核的内容和实验。想要深入从事操作系统内核开发的同学,强烈建议参考 MIT xv6 课程。
- Unit Test (单元测试): 课程提供了强大的测试框架,只需要 include 相应的头文件,就可以对你的底层代码进行自动化测试。
Why 为什么要学操作系统?
开学三板斧,离不开时下最热的黑神话、哪吒,当然还有 DeepSeek。
在现在的互联网时代,无论你是什么专业出身,你几乎可以学到任何想学的东西:通过视频媒体、通过开源代码、通过 AI 对话......
既然如此,为什么还要苦哈哈地学操作系统?
因为这是一个极其庞大且精密的工业结晶。计算机世界里,随便一个操作系统都是几千万行的代码,它们到底是怎么搭起来的?这是一个极好的系统工程范例。
AI 是一个好工具。在如今的时代,你只需要一个梦想,然后利用 AI 作为杠杆,就能迅速追赶上那些读了本硕博十年书的所谓专家。
What 什么是操作系统?
Operating Systems: A body of software, in fact, that is responsible for making it easy to run programs.
(操作系统:本质上是一组软件,负责让程序的运行变得简单。)
操作系统是来帮助我们的!不是来折磨我们的。
- 我们不需要死记硬背精准的概念定义,它的存在是为了帮助我们更好、更安全地开发程序。
- 整个计算机的发展史,可以概括为:硬件 (数字逻辑) -> 软件 (本课程聚焦) -> 操作系统。
极速复习:数字逻辑
- 时钟是不可或缺的,任何系统都需要时钟来驱动。
- 导线。
- 逻辑门。
我们写的任何 C/C++ 代码,最终都会变成一串指令序列,编译成二进制的 a.out 文件,然后交给底层的处理器(数字电路)去执行。
狭义的操作系统
操作系统就是硬件和软件之间的中间层。
操作系统的历史轮回
1940s 的计算机硬件:混沌初开
1946 年 2 月 14 日,ENIAC 诞生,它是图灵机的数字电路物理实现。
- 逻辑门: 真空电子管。
- 存储器: 延迟线(delay lines)。
- 输入/输出: 打孔纸带 / 指示灯。
在这个时代,还没有操作系统! 甚至连编程语言都没有。程序员画完流程图,直接写机器代码,然后在纸带上戳孔。能把程序跑起来就是万幸了。
1950s - 1960s 的计算机硬件:算力成为服务
硬件迎来了进化:晶体管、磁芯内存以及丰富的 I/O 设备开始出现。
但问题来了:I/O 设备的速度严重低于处理器的速度! 这促生了中断机制的诞生。
在这个年代,一张打孔卡片有 80 行,就是一行代码。
早期的操作系统其实就是库函数 + 管理程序排队运行的调度代码。因为算力昂贵,多用户需要轮流共享计算机,当时甚至需要一个专门的职业叫 "Operator (操作员)" 来负责程序的切换。这就是 Operating Systems (操作系统/作业系统) 名字的由来。
因为每个程序(线程)都想尽可能多地占用有限的内存,操作系统不得不出面管理好每个线程。
1960s - 1970s:虚拟化与多任务的觉醒
- 更快的处理器、更丰富的 I/O 设备。
- 更高级的编程语言和编译器横空出世。
在这个时代,操作系统开始进行分时间片运行 。系统能够同时载入多个程序,进行复杂的调度和分片运行。同时,虚拟内存的概念出现,操作系统自然而然地增加了进程管理的 API。
数字电路模拟器示例:
时钟、导线、NAND、寄存器是数字系统的基本组成部分。数字系统在时钟驱动下,离散地更新下一周期的寄存器状态。
下面这段程序模拟了数字电路的执行过程,它也是
nvboard的基本原理。这个例子还展示了 UNIX Philosophy 中命令行工具的协作原理:C 程序logisim输出类似A=0; B=1; ...的数码管状态,而另一个程序负责解析这些输出,并真实地在终端里"画"出来。
bash
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/logisim# ./logisim
A = 1; B = 1; C = 1; D = 1; E = 1; F = 1; G = 0;
A = 0; B = 1; C = 1; D = 0; E = 0; F = 0; G = 0;
A = 1; B = 1; C = 0; D = 1; E = 1; F = 0; G = 1;
A = 1; B = 1; C = 1; D = 1; E = 1; F = 1; G = 0;
...
bash
█████████
██ ██
██ ██
██ ██
██ ██
░░░░░░░░
██ ██
██ ██
██ ██
██ ██
█████████
░░░░░░░░░
░░ ██
░░ ██
░░ ██
░░ ██
░░░░░░░░
░░ ██
░░ ██
░░ ██
░░ ██
░░░░░░░░░
RISC-V 处理器模拟器示例:
C 语言实现的 single-header RISC-V32IMA 系统模拟器 (源自
mini-rv32ima)。因为有 M-Mode,这个模拟器可以运行几乎"任意复杂"的程序------甚至是没有 MMU 的 Linux。底层代码其实非常简单,只有几个状态和变量:
cpp
struct CPUState {
// Processor internal state
uint32_t regs[32], csrs[CSR_COUNT];
// Memory state
uint8_t *mem;
uint32_t mem_offset, mem_size;
};
bash
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/mini-rv32ima# ./mini-rv32ima testcase.bin
[mini-rv32ima] load image file: testcase.bin
[mini-rv32ima] alloc ram size = 0x4000000
[mini-rv32ima] mainargs:
initially:
PC:00000000 [03174291]
...
CYCLEL:00000000 CYCLEH:00000000 EXTRAFLAGS:00000000
stack (sp:04000000):
0x4000000
...
1970s:Unix 的诞生
Unix 的诞生,彻底奠定了今天计算机世界的基础:
- 信号、管道、grep 等经典工具机制。
- BSD Socket 开启了网络时代。
- 把算力变成了真正的 Product。
How 怎样学操作系统?
忘掉 GPA,试着去成为一个有梦想的 CS 人
我们要知道,"编码"是握在手中的利剑。在大语言模型(LLM)的帮助下,我们要敢于自己动手解决问题:
- 什么都不怕:vim、tmux、grep、binutils、甚至是前端。
- 享受创造的乐趣。
- 当出 Bug 时,坚信:机器永远是对的,我肯定能调出来!
- 时刻反思:我这么做显得专业吗?合适吗?是一个合格的开发者吗?代码还能更好吗?
坚守学术诚信 (Academic Integrity) 与 AI 的正确用法
Lab 实验不应该使用 AI 吗?不!日常学习中,强烈鼓励使用大模型:
- 用来解释模糊的概念、复杂的命令行工具、生涩的 API 等。
- 用来获取方法指导:该用什么工具?如何调试?有什么技巧?
- AI 可以提醒你进行错误处理(C语言实验中往往容易忽略返回值检查,导致严重后果)。
红线 (MiniLab 规则):
禁止直接将一段实验作业的描述完整地复制输入给大语言模型让它代写!但你可以利用大模型帮你阅读 API 文档,给你一些简单的提示(仅限单个 API 的用法)。
动手实操:用 AI 辅助学习
Prompt 示例:
《操作系统》需要解压缩
toybox-0.1.0.tar.bz2,但是我是刚选课的新手,应该如何做?
AI 的回答往往非常标准且详尽:
要在《操作系统》课程中解压缩文件,你可以:
- 打开终端:在 Linux/macOS 中打开 Terminal。
- 导航 :使用
cd命令进入所在目录。 - 解压 :运行
tar -xvjf toybox-0.1.0.tar.bz2(-x解压,-v显示过程,-j处理 bz2,-f指定文件)。 - 查看:当前目录会生成一个新的文件夹。
实操演示如下:
bash
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/tar# ls
README.md toybox-0.1.0.tar.bz2
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/tar# cat README.md
**toybox-0.1.0**:这是早前版本的 toybox,包含一些 "最小" 系统所需的工具。现在,Android 内置了 toybox。当你打开手机的 "开发者模式" 后 ,通过 adb shell 连接到手机,其中的命令行工具就是 toybox。
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/tar# tar -xjf toybox-0.1.0.tar.bz2
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/tar# ls
README.md toybox-0.1.0 toybox-0.1.0.tar.bz2
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/tar# cd toybox-0.1.0
root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec1/tar/toybox-0.1.0# ls
Config.in LICENSE Makefile configure generated kconfig lib main.c scripts toynet.h toys toys.h www
成为 Power User!
这门课不只是教你操作系统是如何实现的,更是要你聚焦于应用,成为好工具的掌控者!
所以,从现在开始写代码吧!保持强烈的好奇心。
记住:命令行 + 浏览器,就是全世界!
不需要死扣语言特性、设计模式,只要在大量编程实践中,这一切自然而然就会有深刻的体会。
准备好,正式开始你的《操作系统》硬核旅程!