先列出主要观点,有时间再补充细节:
“学习Linux内核”对不同的人有不同的含义,学习方法、侧重点、投入的精力也大不相同。我大致分三类:reader、writer、hacker。reader 就是了解某个功能在内核的大致实现 how does it work,我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的,
我师父给了一些上位机学习方法和资料,让我不断提升自己,感谢帮助过我的人,
如大家和我一样需要我可以分享资料在评论区扣888或私我888
一般不关心某些极端情况下(内存不足、受到攻击)的处理方法,对于看不懂的地方也可以跳过。我自己最多算半个 reader,只看我感兴趣的一小部分代码(我只关心 TCP 收发数据,不管 IP routing/forwarding/fragment 等,更不会去关心 ethernet 层),而且读一个函数一般只看主干(happy path),不管 security/debugging/tracing,经常忽略错误处理分支。writer 是给内核加feature和改bug的人,需要更进一步的知识,写代码要考虑 how not to break it(哪些地方需要加锁,按照什么顺序加锁以避免死锁,如何正确释放分配的资源等等)。hacker 是通过分析代码找出安全漏洞并加以利用的人,研究 how to break it,读代码恐怕更注意找出error handling分支没有覆盖的case。内核向用户态提供的接口很稳定,但是内核的具体实现变化很快,你深入钻研获得的知识很容易就过时。比方说 Linux 的 TCP 实现在2015年3月新加了 TCP_NEW_SYN_RECV 这个非标准的 TCP state,同年6月发布的 kernel 4.1 才开始用它。如果你学的是一年前的 kernel,那么建立TCP连接这方面的细节知识对于今年发布的 Ubuntu 16.04 可能已经过时了。