这门课的名字已经把范围说清楚了:手写一个操作系统。它不是带你读一遍教材里的概念图,而是让你面对"内存分配器写错了,分页一开就 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]
适合人群
- 计算机专业学生
- 操作系统爱好者
- 有志于学习内核开发的开发者
学习收获
祝您学习愉快!
学有所成,前程似锦!





