这门课的名字已经把范围说清楚了:手写一个操作系统。它不是带你读一遍教材里的概念图,而是让你面对"内存分配器写错了,分页一开就 triple fault"这种具体问题。如果你之前学过操作系统,考试能画进程状态转换图,但被问到"从按下电源键到第一个 C 函数执行,中间谁做了什么"就答不上来,这门课补的正是这一段。

先确认你缺的是哪一块

操作系统这门课有个特点:知识点彼此咬合,缺一环后面就变成背结论。常见的几种缺口,对照一下自己属于哪种。

  • 知道虚拟地址到物理地址要查页表,但没写过页表项,不清楚多级页表为什么能省空间,也不清楚 TLB 缺失时硬件和内核各自负责什么。
  • 会调 fork、pthread,但说不清一次时钟中断进来之后,内核是怎么决定把 CPU 交给另一个进程的,上下文切换到底保存了哪些寄存器。
  • 背过 FIFO、LRU、时钟置换算法的名字,但没算过缺页率,也没想过为什么实际系统不用最优算法、抖动出现时该限制什么。
  • 用过文件系统 API,但没想过"一个目录项到磁盘块"之间要经过几层结构,inode 里为什么要有间接块。

如果上面有几条中了,说明你缺的不是概念,是把概念落到代码上的那一步。这门课的价值就在这里。

内容重心:内存和进程是主线

从课程覆盖的章节看,虚拟内存与页面置换占了相当大的比重。最优算法、先进先出、最近最久未使用这一组,是在讲"理论上怎么选淘汰页";时钟置换和最不常用算法,是在讲"实际系统怎么用近似手段把开销压下来";再往后到工作集置换、缺页率置换,以及抖动与负载控制,讨论的是另一个层次的问题——当内存真的不够时,系统该主动做什么,而不是等缺页把 CPU 拖垮。这条线走完,你对"内存管理不是分配和回收,而是控制缺页行为"会有具体感觉。

进程管理和 IO 系统是另一条线。前者绕不开中断、特权级切换、调度这几个动作,后者要处理设备与 CPU 速度不匹配带来的缓冲、异步通知问题。两条线最终都会落到同一个地方:内核要在有限的硬件机制上,把抽象层搭起来。

怎么练才不算白看

手写操作系统最容易变成"跟着敲一遍,合上就忘"。建议每看完一个模块,先别急着往下走,做三件事。

  • 把这一块的接口先写出来再对答案。比如要实现物理页分配,先自己想清楚对外暴露哪几个函数、调用者是谁、失败时返回什么,再去看实现。
  • 故意制造一次失败。把页表项的标志位改错、把中断处理里的寄存器保存顺序调换,观察崩在哪一步。能定位到具体指令,说明你真的理解了这段机制。
  • 用文字回答"如果没有这个机制会怎样"。没有分页,进程隔离靠什么;没有时钟中断,抢占式调度还成立吗。答得出来才算过。

看完应该能回答的问题

用这几个问题自测,能顺畅答出来,说明这门课没白学:多级页表在什么情况下反而比单级更省内存;LRU 在真实系统里为什么难以精确实现,时钟算法是怎么绕过去的;工作集模型和缺页率置换,一个从进程角度、一个从系统角度,分别想解决什么问题;发生抖动时,增加内存和降低多道程序度,哪个更该先做;一次系统调用从用户态陷入内核,直到返回,中间经过了哪些必须保存和恢复的状态。

这些问题没有标准答案模板,答得越具体越好。答不上来的那一条,就是你该回去重看的那一节。

学堂在线-手写操作系统实战课

深入理解操作系统原理,实战掌握内核开发

编辑点评

从内存管理到文件系统,从进程管理到IO系统,全面覆盖操作系统核心知识,实战项目让你亲手搭建操作系统。

⭐ 编辑推荐

本课程通过手写操作系统的方式,深入浅出地讲解操作系统原理,带你从零开始,亲手搭建一个简单的操作系统。

课程亮点

• 操作系统原理深入浅出讲解
• 实战项目搭建操作系统
• 全面覆盖操作系统核心知识

课程目录

9.5 工作集置换算法_72662_6820.mp4  [117.2 MB]
9.6 缺页率置换算法_72662_5725.mp4  [59.5 MB]
9.7 抖动和负载控制_72662_2078.mp4  [34.6 MB]
9.3 时钟置换算法和最不常用算法_72662_7433.mp4  [154.8 MB]
9.2 最优算法、先进先出算法和最近最久未使用算法_72662_1141.mp4  [167.2 MB]
9.4 Belady现象和局部置换算法比较_72662_6863.mp4  [97.5 MB]
8.6 缺页异常_72662_5760.mp4  [69.2 MB]
9.1 页面置换算法的概念_72662_6413.mp4  [66.4 MB]
8.5 虚拟页式存储_72662_7671.mp4  [98.7 MB]
8.4 虚拟存储概念_72662_7867.mp4  [38.7 MB]
8.3 局部性原理_72662_4057.mp4  [71.1 MB]
8.2 覆盖和交换_72662_9269.mp4  [88.0 MB]
7.5 演示lab2实验环节_72662_9786.mp4  [113.2 MB]
8.1 虚拟存储的需求背景_72662_6606.mp4  [71.6 MB]
7.4 了解ucore建立段_页表_72662_2402.mp4  [103.1 MB]
7.3 了解段_页表_72662_7256.mp4  [66.6 MB]
7.2 了解特权级切换过程_72662_4939.mp4  [134.4 MB]
7.1 了解x86保护模式中的特权级_72662_3623.mp4  [96.7 MB]
学堂在线-手写操作系统实战课程文档.png  [493.5 KB]
6.7 段页式存储管理_72662_3119.mp4  [40.1 MB]
6.6 反置页表_72662_2562.mp4  [60.2 MB]
6.5 快表和多级页表_72662_9880.mp4  [52.2 MB]
6.4 页表概述_72662_2681.mp4  [62.1 MB]
6.3 页式存储管理_72662_2042.mp4  [59.4 MB]
6.2 段式存储管理_72662_7471.mp4  [42.5 MB]
6.1 非连续内存分配的需求背景_72662_4074.mp4  [62.8 MB]
5.5 伙伴系统_72662_3383.mp4  [80.1 MB]
5.3 连续内存分配_72662_2391.mp4  [109.5 MB]
5.2 地址空间和地址生成_72662_1501.mp4  [110.2 MB]
5.4 碎片整理_72662_5454.mp4  [50.5 MB]
5.1 计算机体系结构和内存层次_72662_9919.mp4  [92.9 MB]
4.9 练习六_72662_1998.mp4  [42.5 MB]
4.8 练习四 练习五_72662_3416.mp4  [20.6 MB]
4.7 练习三_72662_7371.mp4  [16.2 MB]
4.6 练习二_72662_1431.mp4  [17.5 MB]
4.5 练习一_72662_8565.mp4  [26.5 MB]
4.4 X86中断处理过程_72662_7462.mp4  [75.0 MB]
4.3 GCC内联汇编_72662_1289.mp4  [28.8 MB]
4.1 启动顺序_72662_8341.mp4  [104.7 MB]
4.2 C函数调用的实现_72662_5598.mp4  [29.8 MB]
3.6 ucore+系统调用代码_72662_6654.mp4  [17.6 MB]
3.5 系统调用示例_72662_3834.mp4  [29.1 MB]
3.3 中断、异常和系统调用比较_72662_7949.mp4  [63.3 MB]
3.4 系统调用_72662_8697.mp4  [39.1 MB]
3.2 系统启动流程_72662_8621.mp4  [60.1 MB]
23.4 磁盘调度_72662_1907.mp4  [104.1 MB]
23.5 磁盘缓存_72662_5178.mp4  [64.9 MB]
3.1 BIOS_72662_2247.mp4  [32.4 MB]
23.1 IO特点_72662_5565.mp4  [68.2 MB]
23.3 IO数据传输_72662_8399.mp4  [61.6 MB]
23.2 IO结构_72662_2595.mp4  [63.8 MB]
22.4 Virtual File System分析_72662_9653.mp4  [47.4 MB]
22.6 执行流程分析_72662_5634.mp4  [59.3 MB]
22.5 IO设备接口分析_72662_6622.mp4  [44.4 MB]
22.1 总体介绍_72662_4215.mp4  [86.2 MB]
22.2 ucore 文件系统架构_72662_1527.mp4  [70.0 MB]
22.3 Simple File System分析_72662_7613.mp4  [67.9 MB]
21.6 文件分配_72662_7163.mp4  [115.4 MB]
21.7 空闲空间管理和冗余磁盘阵列RAID_72662_1520.mp4  [113.3 MB]
21.5 文件缓存和打开文件_72662_6699.mp4  [77.4 MB]
21.3 目录、文件别名和文件系统种类_72662_5307.mp4  [109.0 MB]
21.2 文件描述符_72662_4613.mp4  [104.1 MB]
21.4 虚拟文件系统_72662_9592.mp4  [48.8 MB]
21.1 文件系统和文件_72662_9514.mp4  [52.1 MB]
20.6 信号和管道_72662_9916.mp4  [65.1 MB]
20.7 消息队列和共享内存_72662_4107.mp4  [55.0 MB]
20.4 死锁检测_72662_7369.mp4  [73.6 MB]
20.3 银行家算法_72662_8039.mp4  [80.6 MB]
20.5 进程通信概念_72662_7230.mp4  [64.5 MB]
2.7 演示实验操作过程_72662_8113.mp4  [32.0 MB]
20.1 死锁概念_72662_7562.mp4  [86.4 MB]
20.2 死锁处理方法_72662_1544.mp4  [100.8 MB]
2.6 ucore部分编程技巧_72662_4587.mp4  [38.2 MB]
2.5 x86-32硬件介绍_72662_3638.mp4  [36.5 MB]
2.4 实验环境搭建_72662_2605.mp4  [82.1 MB]
2.3 8个OS实验概述_72662_7445.mp4  [32.8 MB]
2.1 前言和国内外现状_72662_7513.mp4  [63.3 MB]
2.2 OS实验目标_72662_2759.mp4  [32.2 MB]
19.4 管程和条件变量设计实现_72662_4117.mp4  [186.6 MB]
19.3 信号量设计实现_72662_4326.mp4  [70.5 MB]
19.5 哲学家就餐问题_72662_3062.mp4  [34.9 MB]
19.2 底层支撑_72662_7242.mp4  [69.9 MB]
18.5 读者-写者问题_72662_2763.mp4  [88.4 MB]
19.1 总体介绍_72662_8670.mp4  [37.2 MB]
18.4 哲学家就餐问题_72662_4914.mp4  [95.9 MB]
18.2 信号量使用_72662_4570.mp4  [151.8 MB]
18.3 管程_72662_1719.mp4  [52.3 MB]
18.1 信号量_72662_9903.mp4  [96.5 MB]
17.5 高级抽象的同步方法_72662_2465.mp4  [99.6 MB]
17.3 临界区和禁用硬件中断同步方法_72662_9074.mp4  [121.5 MB]
17.4 基于软件的同步方法_72662_3139.mp4  [71.7 MB]
17.2 现实生活中的同步问题_72662_7853.mp4  [104.4 MB]
17.1 背景_72662_9236.mp4  [93.9 MB]
16.4 Stride调度算法_72662_2791.mp4  [89.3 MB]
16.3 时间片轮转调度算法_72662_1298.mp4  [45.0 MB]
16.2 调度算法支撑框架_72662_1749.mp4  [65.7 MB]
15.5 实时调度和多处理器调度_72662_7544.mp4  [80.5 MB]
16.1 总体介绍和调度过程_72662_6685.mp4  [83.2 MB]
15.6 优先级反置_72662_1403.mp4  [51.1 MB]
15.3 先来先服务、短进程优先和最高响应比优先调度算法_72662_3842.mp4  [116.9 MB]

适合人群

  • 计算机专业学生
  • 操作系统爱好者
  • 有志于学习内核开发的开发者

学习收获

掌握操作系统原理
学会内核开发
提升系统设计能力

祝您学习愉快!

学有所成,前程似锦!