前言
我是一位已经参加工作有12年的资深工程师, 职业生涯中曾经担任过 CTO, 也做过总架构师. 精通 5+ 门编程语言, 对 10+ 门编程语言有过万行生产环境编码经验.
但因为自己毕业于一所大专院校, 在大专学习期间学校并没有开设过这些计算机系基础课程. 在多年工作中我时常好奇:
- 应用程序的内存是如何分配的
- 应用程序代码是如何启动的
- 应用如何与操作系统进行交互
- 操作系统是如何管理硬件资源的
- 多线程是如何实现的
等等问题.
抱着求知的心态, 我报名参加了这次的操作系统训练营.
这些基本能力, 对应用开发者来说就像超市货架上每天都能“生长”出来的食物, 操作系统是如何把他们实现的, 我想要了解这个过程.
我曾在2021年参加过一次学堂在线的操作系统课程, 但是因为工作和家庭琐事繁忙, 最终没有完成. 这次我希望通过这次训练营, 继续学习操作系统的知识, 并且完成所有的实验.
我始终贯彻着一句话: 计算机是一门实践工程学科, 不管看的听的再怎么醍醐灌顶, 写不出来就是没学会.
学校的操作系统课程, 大多数都是讲理论, 缺乏实践. 这次训练营, 我希望能开发自己的内核程序, 并烧录到自己的硬件上运行.
第二阶段
Lab 1
这个实验主要是实现一个简单的多任务系统. 通过这个实验, 我理解了硬件是如何在不同的特权级之间切换的, 以及操作系统是如何管理这些特权级的.
Lab 2
这个实验启用了分页机制, 我学习到了地址空间的概念, 应用程序只需要关心自己的地址空间, 而不需要关心其他应用程序的地址空间. 同时我也学习到了内核是如何管理这些地址空间的.
Lab 3
进程: 学习到了进程是如何创建的, 以及进程是如何执行的.
Lab 4
文件系统: 学习到了文件系统是如何与物理存储设备交互的, 块存储设备是如何存储文件与数据的.
Lab 5
多线程: 学习到了操作系统是如何实现多线程的, 以及多线程之间如何通过锁来通讯.
通过课程实验: 我学习了如何用银行家算法检测死锁.
总结
通过这门课程我学习到了很多操作系统的基础知识, 包括:
- 裸机程序是如何启动的
- 应用程序内存是如何分配与隔离的
- 操作系统是如何操作硬件的
- 应用程序是如何与操作系统进行交互的
- 文件系统是如何实现的
- 等等…
同时我也发现课程框架代码存在许多值得改进的地方, 所以我在尝试编写自己的内核程序.