计算机学院2019级研究生 王薇
由于自身对操作系统内核方向比较感兴趣,便选修了Linux操作系统内核技术这门课程。初衷本是想要更详细地了解内核原理,但在实际的学习过程中,却是脱离了浅层的认知,对如何学习操作系统内核有了更深层次的理解,受益匪浅。
任何一门学科或者方向都是博大精深的,想要学精,还是需要在科学的方法论的指导下充分发挥主观能动性,坚持不懈地钻研。由于课时关系,老师无法给我们讲授所有的内核知识点,并且如果照本宣科,那也只能算是学会了一个工具而已,无法举一反三。所谓授人以鱼不如授人以渔。老师首先教的就是学习的方式,从理论到实践。包括如何查找需要的资料,如何编写、调试内核模块,如何阅读与修改内核源码,以及应该了解跟内核相关的哪些拓展知识等。其次以编写驱动模块和管理地址空间为例教我们如何在实际学习中应用这些方法论,并加以实践。
虽然本课程只有短短20个课时,但学习之路是漫长的。随着内核版本地不断升级,如何与时俱进地更新自己的知识体系,才是学习的关键所在。师傅领进门,修行靠个人。我在本课程中学到的学习方法与思维方式将指引我更好地学习操作系统内核知识。
计算机学院2020级研究生 吴悠
我刚开始学习编程,学习C语言的时候,产生了一些让我很困惑的问题。比如:为什么两个进程访问同一个内存地址,读到的值却是不一样的?为什么对数组的越界访问,有时候刚越界就出错了,有时候却要越界到很远的地方才出错?
后来,我通过学校开设的操作系统课程,了解了虚存和分页机制的原理,解开了这些疑惑,同时也感慨于操作系统的强大,感慨于它在背后默默无闻地做了许多事情来支撑着成千上万的应用程序。这让我对操作系统内部的实现细节产生了强烈的好奇心。
为了满足自己的好奇心,我开始尝试阅读Linux内核的源代码。按照阅读普通应用程序源代码的习惯,我试图直接从Linux内核的启动代码部分开始阅读,然后在费了九牛二虎之力查阅各种资料找到启动代码在哪里之后,发现完全读不懂。面对天书一样的内核代码,我彻底抓瞎了,开始怀疑人生。
幸运的是,不久之后,我遇见了李林老师,遇见了这门课程。这时候我才知道,我看不懂内核代码,不是因为我的智商或者能力有问题,而是没有掌握正确的方法。
这门课给我带来的第一个收获是:明白了应该按照怎样的顺序去分析学习一个庞大而复杂的系统,比如Linux内核。首先应该是尝试把这个复杂而庞大的系统,按照功能划分为一个个规模更小,功能更单一,更易分析的子系统,然后分而治之,并且把握住各个子系统之间是如何联系和交互的。比如Linux内核就可以被划分为内存管理、存储IO栈、网络IO栈、调度管理等部分。当然,刚开始由于对这个系统缺乏了解,只能相对模糊地进行划分。随着对各个部分的了解越来越深入,整体的框架划分也越来越清晰。这又反过来帮助我们进一步探索各个子系统,是一个螺旋上升的过程。
第二个收获是,在阅读具体的源码时,遇到问题,我们该怎么去解决。方法就是:由问题引出我们自己的“猜想“,然后设计实验来验证自己的”猜想“,再根据实验结果得出结论或是调整自己的”猜想“,进行新的实验。其中,怎么用实验来验证自己的猜想是一个关键的问题。好在这门课程教会了我们一些非常有用的实验技巧,例如:怎么编写内核模块,调试内核模块和内核代码;怎么修改内核源码并重新编译;怎么进行反汇编,怎么阅读汇编代码。这些技巧能够有力地支撑我们设计自己的实验。
现在,虽然这门课程已经结束,但是我对Linux内核的探索之旅才刚刚启程,而这门课程教给我的学习方法就如同一把利剑,将伴随着我一路上披荆斩棘。