Linux 内核代码大佬们如何观看的?

本文由 简悦 SimpRead 转码, 原文地址 www.zhihu.com https://pic1.zhimg.com/v2-f1b884bf84c2967a64015f1ca9ab7407_xs.jpg?source=1940ef5c俄罗斯解放乌克兰

如果对 linux 不熟悉直接读源码,30 秒内你就会怀疑人生,你以为 500 行代码能实现的功能,linux 会用 5000 行,因为他针对各种场景都做了性能优化,非常多的 cache,以及很常见的把一个玩意存储在 3 种数据结构中(数组,链表,哈希表),嵌入了各种检测机制比如 lockdep,coredump 等等。

所以在看完并彻底理解《linux 内核设计与实现》之前,不要想着看源码,你完全看不懂。

如果你已经对 linux 有了初步认识,并对常见的宏烂熟于心,比如 current,container_of,list_for_each,那么可以从简单的模块看起,比如 spinlock,mutex 是如何实现的,什么是 cas 原子操作(这里会涉及汇编,不过很简单),elf 文件是如何加载的,syscall 都经历哪些步骤。

总之不要妄图看懂整个 linux,linus 本人都做不到。

还有最重要的一点,搞清楚为啥要看 linux 源码,如果只是感兴趣的话,看看博客就行了。

https://pica.zhimg.com/v2-aa818119e2836463c67d485b0f8d9dea_xs.jpg?source=1940ef5cpico​

别看 Linux 内核源码,别好高骛远。

倒是可以先看看 xv6 的代码,很精简、很小巧,如果你有基础一周就拿下了。

不要看 boot.S 这些,写一个扇区,打开第几个地址线,有什么卵用?那只是向前兼容的一种策略而已,把时间花费在这些事情上面得不偿失啊,你又不是参加期末考试背题。最重要的是,你的信心都被这些 adhoc 的东西磨没了。

如果你对操作系统有了基本的了解,应该把更多时间花费在进程管理,内存管理,VFS,文件系统,并发等比较干货的地方,先看书了解基本知识,再慢慢过渡到源码层的东西对性能优化方面的考虑一探究竟。举例来说,进程管理方面,以 namespace、cgroup 为基础的进程隔离是 docker 等容器技术的实现保障,而 VFS 代表的思路就是中间件的基本构想。内存管理的精巧自不待言,虚拟内存和链接、装载等放在一起又是一本大书,你不看书,生啃代码能把这些东西从内核中抽取出来吗,就算能,为什么不先看书理清理论再实践呢,好多坑大神呕心沥血先帮你踩过了,前人的肩膀还是香的吧。

然后就是根据工作、兴趣需要去读代码,不要从头开始一个个文件读,你以为内核是一个 main 函数?从头读到尾,return 0 完事了?甚至不是读代码,能把每一个文件夹理清楚干啥的都花费不少时间。先读书吧少年,源码是最终 boss,你现在是个没有装备的小兵。

先读 ostep、csapp,然后推荐读一下 bach 的 “the design of unix operating system”

真想看代码也配一本好书,比如 professional linux kernel architecture. 我看了一点太厚了扔一边了… 不过写的确实很好

https://pic1.zhimg.com/v2-62b9729892e47d5ce441059ccd4fe42b_xs.jpg?source=1940ef5c lu luce

作为一名前 Linux 代码阅读人肉实验员,说一下我的实际操作经验。

第一,和很多学生党的初始想法不同,看 Linux 代码的目的不是通过阅读代码加深自己对于《操作系统》专业课的理解。而是在你已经对于《操作系统》这门课程有了一定程度的理解以后,甚至你已经大学毕业了以后,参加编程工作了以后,看一下工业大佬们在自己编程的时候,是如何巧妙的解决问题的。甚至是如何干脏活的。学习到这些被固化在代码中的大佬们的多年工作经验

第二,看内核代码的要求和刘电工写三体的要求差不多。就是你需要有一份可以划水的工作。毕竟看这种东西没有个一年半载的全职时间,肯定不行。因此上需要上学的学生党就退散吧!

第三,Linux 的代码其实没有那么多。首先代码包里面一般是驱动程序。包括上世纪八十年代的磁带设备,各种 90 年代的拨号终端。很多都是一些老古董。都没有必要看。还有就是很多针对不同的 CPU 和体系结构的代码,这种代码对应的硬件,你这辈子估计都不会遇到。也可以跳过。

我说一下我的人肉实验成果。首先我找了一份电信运维的工作。对,就是和大刘差不多的工作。之后,根据这本书,把代码对一遍。

https://pic1.zhimg.com/v2-110e69a8f7949777dcf41f3934add5b8_r.jpg?source=1940ef5c

大概需要两年左右。

完了。

至于看完了以后有什么效果,其实没有任何效果。因为这个东西在面试的时候,没法使用。我倒是在面试的时候,被人问过相关的问题。就是你有没有看过内核代码一类的问题。这个问题非常难以回答。首先你说没看过吧。对方会认为你没有技术钻研兴趣。对你印象不好。你要是侃侃而谈内核代码相关模块的逻辑吧。。对方会露出一种吃屎一样的表情。就是没想到我对于代码这么了解。对方本来想和我装个 B,结果发现自己水平不如我。不管是那一种对于找工作都没什么好处。

因此上,我现在对于这个问题,一般都是回答没看过。之后靠其他的技能拿 Offer。