做为一个过来人,我谈谈我自己的看法,欢迎大家补充:
首先肯定的一点是:不要一上来就看内核代码,基本上你会很快被挫败感打败。内核正在变得越来越庞大,学习曲线越来越陡峭,当你一无所知的时候冒然进入linux kernel,你会发现处处都是障碍,处处都是大坑,你根本走不下去。最好的方法是把对内核源代码的热情先放在心里,从基本功开始。
我认为的基本功包括两个方面:
1、linux的基本操作。内核中的很多设计都是源于应用,你不理解用户空间的操作,也就不会知道内核空间在干什么。这时候,你需要做的就是在自己的计算机上安装一个GNU/linux操作系统,Debian、Ubuntu什么的都OK,最好去掉其他的OS,这可以强迫你在linux下进行学习,工作,生活。在这个过程中,你可能需要google检索一些信息,安装一些软件,学习使用这些软件,理解一些基本的linux的背景知识......如果你想要从事底层的软件开发,那么尽量在终端下工作,这样会让你和linux kernel更接近一些,从而提供更多关于内核的基础知识。
2、第二个方面是软件相关的基础知识。你最好学习一些软件的逻辑思维,学习掌握一门语言,当然最好是c语言。掌握其基本的语法和语义,然后在linux环境下进行实际训练。这里不得不隆重推出一本经典之作《Unix高级环境编程》,仔细阅读这本书,然后动手实践,编写linux下的小程序,给自己找些乐子。
有了基本功之后,你可以选择强攻Linux kernel,不过呢我还是建议从一个小的RTOS入手,构建下面的知识体系:
1、关于OS的基本概念。什么是进程、什么是线程,什么是中断,什么是文件系统,什么是内存管理,什么是上下文,什么是设备管理等等。
2、关于处理器以及周边硬件的基础知识。可以选择ARM,也可以选择其他的处理器,主要是从软件角度来理解一个处理器,知道CPU的基本组成,知道什么是MMU,TLB,中断处理流程,总线的概念,什么是指令集等等。这时候,相信你会接触一些汇编指令,不一定要能写,但是一定要能读懂。
上面的阶段都没有接触Linux内核,但是不要着急,我们马上就要直面Linux内核了,第一个问题就是选择什么版本,不需要太新,但是越早的内核就会越简单,有助你可以把阅读linux内核代码的习惯持续下去。你有几个选择:
1、配合《Linux内核完全注释》来理解0.12内核。我没有看过这本书,听说不错。
2、配合《Linux内核情景分析》来理解2.4内核。当年就是这本书引领我来阅读内核的,我一直都对其充满感激之情
3、配合《深入理解linux内核》来理解2.6.10内核。非常好的书,强烈推荐,我基本上阅读了好几遍这本书,中文版一遍,英文版3遍,每次都有不同的收获。
阅读代码的过程有些枯燥,可以考虑撰写实际的驱动程序来调节一下,《Linux设备驱动》是不二之选。
最后,整理一些心得:
1、英语很重要、英语很重要、英语很重要。一定要学好英语,尽量看英文版书籍。
2、多动手,多思考,多总结。如果有机会,把自己的心得整理出来并发布,和其他工程师交流,这个过程可以有助于夯实你对Linux kernel的理解。
3、clone linux stable的代码仓库,多读一读git log,那是无穷的宝藏;
转载地址:
http://www.wowotech.net/forum/viewtopic.php?id=5
http://www.wowotech.net/