内核是一个让人既爱又恨的东西.
读书的时候,我就一直就想读一下内核的源码,但是那个时候真的只能说基础薄弱,而且从来没有接触过那么大的一个项目,不知从何入手,所以这个计划就一直被搁浅.我曾经跟着公开课鼓捣过好几份内核源码,但是那些源码只是玩具一样的东西,和真实环境中使用的内核不可同日而语.不得不说,不能深入虎穴,实乃人生一大憾事.
出学校的第一份工作和网络有着千丝万缕的关系.虽然第一年做的东西和内核不太相关,可是越到后面,越发现,如果不能正确理解内核,我很难做好手中这份工作,毕竟,一个做网络的人,怎么能对内核协议栈过分生疏呢?因此,大致从第1年起,我就找了一些linux方面的书,想着边看代码,边看书,相得益彰.由于工作的忙忙碌碌,第一遍滚内核协议栈的路程,断断续续,一走就是1年多。 要说收获吧,也有,我只是加深了对内核协议栈的了解,这种了解并不是很全面,每一个知识点都离散开来,虽然遍地开花,但是连不成片,构不成面,总觉得还差了点啥。
第一遍走完,感受还是不怎么深,然后进入第二年,发现技术上面,时常要处理一些linux相关的问题,包括arp,cpu占用高等,为了了解这些东西,我又硬着头皮去回顾了一下linux内核协议栈。顺带还买了一些评分比较高的书籍对照着看,包括linux驱动架构,cpu运行原理等.
就这样,断断续续又过了一段时间。终于到了今年这段时间,在了解了软中断,硬中断,中断向量,地址映射等概念之后,我突然发现,虽然还是有些困难,内核代码确实已经可以读下去了。内核是一个整体,知道了一些核心的知识之后,原来离散的知识点连成了片,构成了面,整个协议栈的运行流程我已经比较清晰了,报文怎么转发,怎么发送也有大致的了解,现在唯一欠缺的,就是更加深入的去琢磨每一个小的知识点,比如聚合口的实现,网桥的实现,tcp协议的实现,路由的实现.那些东西终究不算太难,花一些时间,总是可以摸得很清楚的.
现在看来,linux内核其实并没有那么可怕,我们其实也并不需要将所有代码都一一读完,比如你做网络,就只需要读协议栈即可,这里总的代码量,估计不超过4w,比上层应用库的大小小多了.
如果你也想读的话,我这里给一些建议:
1.我建议你先了解一下linux的基础设施,包括自旋锁,等待队列,定时器,硬中断,软中断这些内容,这些算是基础,了解这些之后,后面读起来会轻松很多.
- 在读相关模块之前,先了解一下相关领域的知识,比如在读tcp模块之前,你最起码要知道tcp有哪些字段,每个头部选项怎么使用,在你没有相关知识之前,不建议去强读,收益不大.
其实内核的代码实现很优秀,比我们某些程序员写的代码容易读多了.算了,写了这么多,我其实就想感慨一句:
今天,我终于站到了这里,今天,我终于有能力一探内核的方方面面,好的,那就开始吧,不用害怕.