- 论坛徽章:
- 0
|
[b]深入理解之前的痛苦和摸索
记得一个老师曾经说过,做学问的三重境界:
第一:昨夜西风凋碧树,独上高楼,忘尽天涯路,相信每个刚开始接触LINUX内核的兄弟都有这样的感受,
第二重:衣带渐宽终不悔,为“伊”消得人憔悴,看代码的时候每个人都会被一段弄不懂,或者不理解的机制搞的晕头转向吧!
第三重:众里寻他千百度蓦然回首那人却在灯火阑珊处,当兄弟们突然弄懂某个问题的时候,有木有这样的感受啊!有木有啊!
废话少说了:简单的谈谈自己痛苦的这段过程吧,我发现,其实人很奇怪,让我们回首最深刻,最刻骨铭心的那些记忆,往往是痛苦的事情!还记得,当初读的第一段代码:bootmme.c
看这个代码看的真是让人崩溃啊,前前后后总共看了一个月,还是清楚的记得:当初为了弄懂PAGE_MASK,PAGE_SHIFT,等等这些东东,看了很多方面的书,后来最终弄懂也是通过结合源码和深入理解Linux内核这本书,后来发现漫无目的的乱看源码效率很低!
于是做了一个决定,首先将《深入理解LINUX内核》和《linux源码情景分析》这两本书各自看了2-3遍,看完之后大概对LINUX整体系统的结构有了一些清晰的了解,
对内存管理这块的结构,以及在系统中的位置,与其他模块的交互,以及LINUX内存管理提供的功能,每个功能实现的方案都有了一定的了解!于是我决定要去看源码了,统计了,我发现虚拟内存管理这块的源码大概有10W左右(我看的是2.4内核),有了上面两本书的基础,我决定将源码分为以下几个部分慢慢去琢磨:
第一部分:启动部分与内存管理相关的
第二部分:初始化部分与内存管理相关的
第三部分:系统正常运行的时候内存管理部分
第四部分:内存管理与其他子系统之间的交互部分
第一部分:发现这部分其实蛮难读的,因为这块主要是汇编语言,说实在话,对于我来说完全读懂是不可能的,但是,从这里,我大概知道几点:段表的设置,页表的设置,寄存器的一些配置,内存大小的探测,
当初看这部分的代码的时候:有一个问题困扰了我一下,就是VGA的问题与页表映射的问题,
第二部分:初始化部分与内存管理相关的,到这边开始慢慢进入的佳境,读起来很快,没有遇到什么问题
其实真正的问题主要是在第三部分,这部分相对来说是比较难的,因为这块也是比较核心的,当初这块不懂的问题最多了,还记得曾经为了弄清楚缺页异常的每一个流程,就花了1一个月的时间,还发帖子到CU上,发现没人回复,没办法,有得自己闷头去搞了!
对于我们搞内核的人来讲,条件是蛮艰苦的,很多问题别人是不了解的,就算了解也不是那么的深刻,每个人也许只对自己弄的那块比较熟悉,可以对于你这块,别人不一定了解,那怎么办只能靠自己去摸索,去研究!
发现,真正静下心来搞内核的人是需要非常大的耐心,也需要你的激情,因为内核代码不是几百行,几千行,而是几万行,甚至10几万行,以前认识一个牛人:专门是做IO优化的,他说他做了一辈子的IO优化了,他说有的时候搞一个问题,也许一搞就能搞上几个月,
我一个师兄,以前在查一个内核问题,查了3个月,后来发现越来是一个函数在初始化的时候把值设置错误了!所以,可以看出耐心和激情,兴趣是多么的重要!
哎,做内核的真的是伤不起啊!有木有啊! |
|