You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 编辑手记 | 升级认知,迭代自己的操作系统
你好我是宇新《操作系统实战45讲》的专栏编辑。
除了负责更新课程里的内容,我也一直关注着小伙伴们的留言。这次,终于有机会自己也留一回言了,很开心能用编辑手记的方式,和你聊一聊我的想法。
### 这门课的独特之处
细心的小伙伴可能发现了,我们的开篇词标题是“为什么要学写一个操作系统?”注意,不只是学操作系统,而是学着去“写”一个操作系统。
你可能还会想,平时我们接触不到的“黑盒子”,现在却要我们自己写代码实现,听起来很有挑战啊?为什么会这样设计呢,且听我慢慢道来。
操作系统博大精深,甚至每个子模块单拿出来讲,都有无数的知识点,太容易只见树木不见森林。但用一个实战项目连起来的话,就能很好地帮助我们聚焦关键问题。
**看似“写”操作系统,这是把难度升级了,其实是为了控制我们的作战范围**。写操作系统的时候,涉及哪些关键要点,我们就相应地学习研究这部分内容。
现在成熟的操作系统像是Linux系统它的源码量级已是今非昔比我们去看源代码总会晕头转向。但老师的课程像是一条线把实战需要的东西都展示出来想要深入研究的同学建议对照查漏补缺然后继续跟着课程走这样才能实现“螺旋式”进步。
如果你也喜欢玩游戏的话,估计有这样的体验,把游戏调成了无敌模式,很容易就会索然无味。没错,有挑战的游戏才好玩。有时候卡在某一处确实很痛苦,但是突破以后也会爽。你不妨把自己当作玩家,去攻克一个个操作系统的关卡。当然了,你也不是孤军奋战,遇到疑问,还可以通过学习、交流和讨论去解决。
课程的思路我就说到这里,如果你感兴趣,还可以看看我们的[课程设计文档](https://shimo.im/docs/rrwqWwhxvcTtygG6)。
更多课程设计的缘起也可以看看LMOS老师好友Yason Lee的解读[《大咖助场|以无法为有法,以无限为有限》](https://time.geekbang.org/column/article/429070)。
### 怎样学习这门课
课程上线以后啊LMOS老师跟我都在关注大家的留言反馈。
学习这门课的同学身份各异,从学生党到已经退休的朋友都有,但共同特点就是对操作系统充满热情,因为这样一个专栏而结缘。无论是在课程交流群,还是课程留言区里,这两个疑问算是高频出现的。
1. 学习这门课,我需要什么前置知识?
2. 某个问题/知识点好难啊,我该怎么办?
这里我就从编辑的视角说说我的看法吧。
**先说第一个问题**,需要什么基础。我一直在琢磨这个问题背后的含义。同学们的水平参差不齐,有畏难心理这很正常,你学习课程的时候,其实是明确了自己哪里“不会”,换个角度想,这样学习的时候不就能有的放矢了么?
不少同学担心自己不是科班出身其实LMOS也不是科班出身的这些历史问题还是翻篇更好你过去怎么样并不代表你之后不可以学习、研究操作系统。而且就算是计算机相关专业的同学可能学生时代上的操作系统课程也没留下特别深刻的印象考完试就还给老师的也大有人在。
现在还没有看完的同学也不要着急,因为更新的速度肯定要比你们的学习速度快上不少。你需要做的是按照课程顺序持续学习,慢慢来,遇到不懂的,就多看几篇,多看几遍。
课代表陈诚同学说过一句话,我记得特别深,他是这么说的:
> “其实,我觉得我们想学写操作系统,有时候是为了一碟醋包了一顿饺子,但是最终饺子是自己的了。”
我注意到有不少小伙伴为了打牢基础为了跟上课程去补充了汇编、C语言以及计算机组成原理方面的知识我要给这些人点赞。
但是,就算你没有把那些图书从头看到尾,其实也同样可以跟着课程,循序渐进地学习。建议你边学边练,动手跑起来。哪怕最初你只能复制老师给的配套代码,但是只要肯用心,也会对操作系统有更深的理解。与其苦恼于自己基础不行,不如踏踏实实去学习精进。
为了让你明确每个模块的内容重点和难易程度,我为你整理了一张表格,你可以做个参考。
![图片](https://static001.geekbang.org/resource/image/ae/cc/aefea2e304e431a85e95684f1a2f7bcc.jpg?wh=1814x1112)
如果你还是想把操作系统的相关资料也都一并啃下来那可以看看LMOS提供的**参考书单**,在学有余力的情况下拓展阅读。
1.关于编译工具LD手册、GAS手册、[GCC手册](https://www.gnu.org/manual/manual.html)、[nasm手册](https://www.nasm.us/xdoc/2.15.05/html/nasmdoc0.html)、[make手册](https://www.gnu.org/software/make/manual/make.html)
2.关于GRUB[GRUB手册](https://www.gnu.org/software/grub/grub-documentation.html)
3.关于CPU[Intel手册](https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html)
4.关于汇编:《汇编程序设计》;
5.关于C语言《[C语言程序设计现代方法](https://book.douban.com/subject/35503091/)》;
6.关于操作系统:《操作系统设计与实现》。
如果你想参考优秀课代表的学习经验与方法,可以参考后面这些用户故事。
1.零基础yiyang同学的[课程实战经验](https://time.geekbang.org/column/article/471872)
2.优秀课代表pedro的[技术学习方法](https://time.geekbang.org/column/article/396020)
3.技术发烧友spring Xu的[课程学习思考](https://time.geekbang.org/column/article/410155)
4.安全产品研发leveryd的[动态调试学习法](https://time.geekbang.org/column/article/469046)
5.课程优质笔记分享达人neohope的访谈加餐[技术学习与职业成长方法论](https://time.geekbang.org/column/article/415861)。
下面我再说说第二个问题,当你具体学习的时候,觉得某个知识点很难,应该怎么办?对于这个问题我想给你分享三个小建议。
**第一个建议就是做好心理建设。**
就拿不少同学都觉得头疼的内存管理来说吧。其实当时我在看这部分稿件的时候也觉得压力山大。记得当时LMOS老师还鼓励我说挺过去就好了。现在你看到的内存章节其中1618讲原先是一整块的内容我们经过讨论优化考虑让大伙儿更容易跟上才拆分细化成了三节课。
内存是内核的内核肯定很难。不过就像英语单词不能永远背到“abandon”一样想要深入地探索操作系统这关必须迎难而上。
以[第19课](https://time.geekbang.org/column/article/386400)如何管理内存对象为例不知道你看没看到置顶评论中“neohope”同学的学习笔记建议重点关注一下他抓“关键”内容的能力。
古语说,不积跬步无以至千里。你可能会怀疑自己,但不必过度焦虑。如果咱们因为差距过大,而陷入弃疗状态,那就太可惜了。哪怕是“大佬”,也曾有萌新时期,基础不好就慢慢跟进。
**第二个建议就是明确自己的需求,按需学习。**
虽然没有什么“跳关”秘籍,但还是有些技巧让你快速掌握一节课内容的。没错,就像数据结构一样,每节课也有“内容结构”,想要快速消化,可以着重理一理后面这几点:
* **这个模块/这节课要解决什么问题What**
* **思路是什么/ 为什么要这么解决Why**
* **具体如何用代码实现How**
你还可以自己动手用流程图画一下pedro同学推荐了此方法你可以试试绘图工具 Graph-Easy这样不容易迷路。
当然,如果你已经有不少的学习积累,或者目的不在于“全景浏览”和“扫盲”,而是想要更加深入,那你必然要花费更多苦工。操作系统是星辰大海,建议以你困惑的问题为导向,进行专项突破。
比如,[第23节课](https://time.geekbang.org/column/article/389880) Slab 内存对象,来自课程交流 1 群的zzyj同学就分享了Slab作者写的[参考文献](https://srl.cs.jhu.edu/courses/600.418/SlabAllocator.pdf),你不妨搭配使用。
**我的第三个建议是,积极交流,在反馈和记录中激励自己。**
虽然学习方法重要,但我们也不要沉迷于把时间消耗在“找方法”上。很可能“优质方法”给你节省的时间,还赶不上你在找方法这件事上花掉的时间。
一人计短,众人计长,我们课程开设留言区,在部落开[话题](https://horde.geekbang.org/topic/comment/fEHRVJ54J9Oet2BJTCG2aUsG5K07tzzh8hBTfhaeX_o?utm_source=pinpaizhuanqu&utm_medium=geektime&utm_campaign=guanwang&utm_term=guanwang&utm_content=0511)(推荐你在话题下分享自己的学习收获,晒一晒实战截图),搭建用户交流群,就是为了让你的学习之旅不再孤单,让我们在分享交流中一同进步。
除了多交流,我也强烈推荐你学习留痕,把你的阶段性学习成果、经验记录下来,这些都能激励自己坚持学习。都说闻道有先后,术业有专攻。百科全书式的人毕竟是少数,但爱学习的小伙伴总会遇到志同道合的朋友。
今天的提问者,也许明天就有能力给别人解答问题了,这就是教学相长。我们的助教 Jason提到
> “教别人是个沟通的过程,各种感官都会调度起来。调度越多,大脑参与理解记忆的部分就越多,以后回忆起来,搜索路径就越多。光看的话,只是眼睛。这跟实践出真知,道理类似。”
古语有云“读书有三到:谓心到,眼到,口到。”有了主动输出,可以带动你整理自己的理解,还锻炼了表达沟通能力,一举多得。
总之,你可以把这个专栏作为导航,但驾驶位你必须自己坐。临渊羡鱼,不如退而结网,坚持学习和实践,相信你会不虚此行。
### 1号用户的独家体验
说了这么多最后我还想说说做这门课的感受。从5月10日上线到现在这个专栏已经伴随你3个月的时间了。不过作为享受了抢先阅读福利的编辑我这个1号用户跟这个专栏共度的时间要更久一些算上专栏的前期沟通、筹备、打磨这些环节一共8个月。
记得LMOS跟我说过当年他写书的时候用了13个月写完了22万字而专栏里只算课程内容文字就超过了这个数字但我们却是用了8个月跑完了这场“马拉松”。当然老师的工作量远不止这些就比如Cosmos配套代码的设计跟实现同样是一个极具挑战的大工程。
说句题外话LMOS兴趣广泛爱好文学、音乐。日常写代码之余他还会拍各种好看的照片能当壁纸的那种还是一个被代码“耽误”的摄影师。
但是他一旦进入工作状态,就会非常负责。操作系统的知识体量很大,为了把内容讲得更清楚,就需要老师花很多功夫对内容反复修订。除了对内容品质的高要求,老师也非常乐意回应大家的问题,在课程交流群里也很活跃。
LMOS身体力行地给我上了一课我确实被他的热情打动了也希望这份热情能够通过专栏传递给你。
最后我想和你说的是,积极学习,但不要盲目轻信。我们在[第4节课](https://time.geekbang.org/column/article/374474)分析各种操作系统特点的时候,老师有条留言回复是这样说的:
> “保持中立,务实求真,对比之下,方见真章。”
这让我发现,学习就是我们把自己当作一个“操作系统”,保持理性,客观公正,而且要不断优化自己对外界信息的整合能力,升级自己的思考方式。
知识不懂,借助搜索工具就能较快填补,但思维方式的迭代,还有经验洞见的积累,却需要长时间的努力。课程更新结束了,但我们的学习之旅还很漫长。升级认知,迭代自己的操作系统,这需要长期坚持。
另外,[Cosmos项目](https://github.com/CosmosPsi/CosmosDocs)现在已经开源也欢迎大家加入其中。希望《操作系统实战45讲》成为一座灯塔为你指路给你带来新鲜的认知成为你探索星辰大海的引路者加油