本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
我在刚毕业的时候,曾经准备看过一次内核。但是因为当时水平有限,看得非常郁闷和不解,所以根本就没有检查下来。如果说收获的话,就是知道内核大概是什么样子的。
工作以后,工作也是应用层的。但是始终对内核比较感兴趣,于是linux内核方面的书也看了不少,像《深入理解Linux内核》,《linux内核设计与实现》,《Linux设备驱动程序》,《Unix操作系统设计》,等等。加上不同版本的,估计得有10来本吧。
虽然只看了书,并没有真正去看内核的源代码,但是慢慢的linux内核对我来说,已经不像以前想象的那样神秘了。以前因为觉得操作系统很神奇,所以一直想学习。现在呢,基本的概念和原理也比较了解了,反而没有了以前那种对内核知识的渴求了。尤其是我的工作基本上与内核无关,所以对内核的学习也只是浅尝辄止。
慢慢的,随着工作的内容逐渐进入底层,从应用程序到7层,再到4层,3层,2层。我发现只是了解Linux的应用已经远远不够,于是再次兴起了学习linux内核的念头,并真正付诸于行动。
因为工作主要是网络方面,所以我主要是学习tcp/ip方面的源代码。现在发现对应用和上层协议的熟悉,对看内核源代码有极大的好处。现在读源代码,不再像以前那样茫然了。基本上仔细研究研究,查查资料,都可以读懂了。所以我个人觉得,作为一个平常人,还是先把上层应用搞懂以后,最起码写应用程序是把好手的时候,再去学习内核,会容易很多,也更有效率。
现在学习了将近2个月左右。发现自己又走了一些弯路。在学习代码的过程中,我太过于关注代码的细节了,总想把每行代码都搞懂。而实际上,我并不是一个内核开发工程师。对我来讲,对于内核的掌握,不应该是去扣每一行代码,而是内核的框架和设计!搞懂一切细节固然是好,但是在有限的精力和时间的条件下,最大的产出是学习内核的框架和思想。对于网络部分的代码!搞懂包的处理流程,比搞懂一个复杂的数据结构有有用的多!所以以后,我要转变学习的方法,尽量去从大的角度去学习,而不是去研究细节。细节留到以后再去完善。
君子当一日三省其身!在学习的过程中,也要不断的总结和思考!提高自己的学习方法,才能真正的事半功倍!
到今日为止,对于TCP/IP,我已经把一条主线建立起来了。就是我的一篇博文《数据包完整接收流程》,基本上对于数据包从网卡到socket的流程,有了比较清晰的概念——当然只是一个简单的流程,没有涉及太多的细节。但是随着这条主干的建立,我可以沿着这条延伸,建立一条条支路,最后形成一个详细的树状流程——也就是完整的TCP/IP协议栈。
附件是目前我画的学习过程中,涉及的TCP/IP流程,随着时间的推移,我会加入更多的细节。
阅读(9681) | 评论(25) | 转发(1) |