Linux 学习笔记 0 - 三个感想
之前断断续续看过 Linux 内核,主要是网络部分,而且是片段性的,自从学完《操作系统实战 45 讲》,这几个月从头开始了内核的学习之旅。
目前仅是在 CPU Scheduler 部分看了个大概,而且大部分时间都是在走弯路了,总结一下,以人为鉴。
1. 别人写的材料,不要看的太细
关于 Linux 内核的材料有很多,搜索一下就能找到不少文章和视频,客观来说绝大部分质量很高,写的也很细致。
开始笔者也投入了很多精力研读一些源码分析类的材料,但是下来感觉效果不好,反而是一些讲解思想和发展历程的“务虚”文章帮助比较大。
其中的原因有两个:一个是内核的代码变化太快,不同版本差别很大,而绝大部分材料都比较陈旧;另一个就是处理流程都看懂了,但是不理解,会感觉实现上很奇怪,甚至“不合理”,实际上还是不懂。
思想上的问题解决了,最后还得落到代码上,就是得看第一手的源码,但是直接看的难度很大,此时需要工具的帮助。
2. 工具很重要
看代码
现在已经对 Linux 内核的代码结构有个全景的理解,所以感觉用 vim + fzf + regrep 看源码挺好,但是一开始会感觉挺难,笔者开始用的是 VSCode,结合vscode-linux-kernel生成 compile_commands.json,基本上是 IDE 的体验了,但是 CPU 消耗很高,风扇狂飙,后来就不用了。
Debug
对于这样一个复杂的项目,只是用眼看肯定是不行,需要一个“把玩”的环境,通常来说有 QEMU 和 UML 两个方式,可以参考《通过 QEMU 打开学习 Linux kernel 的新世界》和《另一种学习 Linux kernel 的方式 —— UML》。
另外就是学好 GDB 也很重要。
3. 不要一开始就挖太深
Linux 内核的模块划分还挺清晰的,但是错综复杂又互相关联,牵一发而动全身,所以笔者在看代码时经常会很发散,回过头来想想实际上相关模块先看看接口即可,不必深挖。
另外就是内核涉及的基础知识很多,例如内核中的双向链表结构,整体上理解并不难,但是要搞明白为什么赋值操作得加上 WRITE_ONCE,那就得进入编译器的领域了,先看看注释即可,不必深挖,虽说欠的债迟早都得还,但也不必马上还。
版权声明: 本文为 InfoQ 作者【袁世超】的原创文章。
原文链接:【http://xie.infoq.cn/article/cb278071806f2aa186291ffaa】。文章转载请联系作者。
评论