写给像我一样的Linux内核初学者

--孔建军(Kongove.CN)
2008.11.12

首先,让我们来看几组令人振奋的数据。现在订阅Linux内核邮件列表[1],每天的邮件流量大概在500份左右;执行”grep “^P:” MAINTAINERS |sort -u|wc -l”,对内核子系统维护者进行统计,得到的结果是534人;从2007到2008年,平均每天有4300行代码添加到内核,有1800行代码从内核删 除,有1500行代码被修改[2];内核2.6.27发布以后,内核开发者使用脚本统计内核文件(包括空行、注释),已经超过 10,000,000,000行[3]。那么,有多少人读过内核源代码?又有多少人为内核开发做过贡献? ….

看到这些你或许有尝试一下的冲动,那就从现在开始疯狂的Hacking吧。下面是我自己学习中的一些感受,只是一些学方法或建议,希望能对你有所帮助。

首先,得有具备一些基础知识,如C语言基础、数据结构、微机原理、网络基本原理、操作系统、体系结构等,当然这也和你具体研究内容有关。下来就是习 惯英语,尽管有很多优秀的翻译资料供参考,尽管有很多出色的国内程序员活跃于邮件列表,但英语沟通是每个内核开发人员无法绕过的一个槛。英语里丰富的专业 词汇和广泛的使用群体,会成为沟通的最佳选择。如果你的英语自认为不是很好,那么我或许能给你一些建议。平时经常查阅man手册、 wikipedia[4]、FAQ等在线文档解决遇到的问题,参与合适的国外邮件列表,参与一些英文交友社区(如Facebook等),交笔友、IRC频 道及时聊天都是不错的方法。这些途径基本上都是和技术沾边的,当然也有很多其他方法提高英语水平。

内核的学习,先得对整个有一个全面的认识,了解各个核心部分的工作原理。因为Linux内核的工作是各个部分紧密配合完成的,各子系统之间的逻辑关 系比较复杂。这里建议读一些经典的书,如《Linux内核设计与实现》、《深入理解Linux内核(ULK)》,这样可以少走弯路。这些书都有中文翻译, 如果觉得直接看英文有些吃力,可以先看中文,或者中英文对照着看。这些书都有好几个版本,针对2.4、2.6内核的都有,可以先看针对2.4版本的,然后 再看针对2.6的。这里不得不提一本清华的教材《Linux操作系统原理与应用》,这本书非常适合入门,前面提到的ULK虽然涉及知识全面、讲的深入,但 对于初学者往往会陷入知识点的细节当中。这本教材把很多细枝末节省略掉,展现在读者面前的只有各部分的关键知识块。同时有大量图片说明,搞懂这些图,也就 理解了抽象的内部机制。其中每个章节都附带一个代码实例,通过调试这些程序可以加深对知识的理解,把抽象的东西实例化。你也可以在这本书作者维护的网站内 核之旅[5]中,找到更多的实例代码和相关资料。当然不排除有更好的入门教材,推荐这本只是我看过比较好的一本。

当你对内核已经有了一个初步的认识以后,你就需要围绕某一部分进行深入学习了。这样才能有深入的研究,从而做出实用的东西出来。比如网络设备驱动、 内存管理、文件系统、内核调度、中断异常、内核同步等。这里还是得有经典教材的指导,如果你想搞驱动开发,《Linux设备驱动》是必读的;如果你想深入 内核的网络部分,《Linux网络设计与实现》等等。

在学习内核过程中,源代码是最好的参考资料,你可以从Linux内核官网[6]下载最新的内核源码,也可以选取交老的版本分块阅读。内核源码的阅 读,难就难在整体的一个把握上,所以建议大家先选取局部核心数据结构、代码、文件进行分析,如task_struct结构体、fork.c文件等。在阅读 源码的同时,结合一些较小的实例程序练习,从而真正理解源码。在学习过程中如果遇到问题,最好现查看手头和网上的资料,实在解决不了,可以去邮件列表(中 文内核邮件列表[7])。

如果在学习内核的同时,你想尝试参与真正的Linux内核开发,请继续往下读。首先了解内核开发的大牛,搞清楚Linus Torvalds, Andrew Morton, David Miller等主要维护者的工作内容,如果你想作ARM方面的开发,你还得知道Russell King,你可以通过MAINTAINER文件了解更多子系统的维护者,当然不是全部要了解。其次你得理解内核版本的命名规则,以及如何制作和提交补丁。 从而熟悉内核开发的现状和流程,更加有效的跟踪Linux内核开发,同时坚定自己的信心。这样你的工作才能真正进入Linux内核当中。这里推荐一些资 料,内核文档(HOWTO、SubmittingPatches、SubmittingDrivers等,都可以从内核源码Documentation目 录下找到)、Linux内核测试指南[8]。

你得学会利用内核Bug的跟踪系统Bugzilla[9]工作,学会使用Git版本控制工具,理解树的概念。使用Git来跟踪内核的开发,关于 Git的使用请阅读Git的帮助手册[10]。Git工具、邮件列表等的使用,其实质是学会沟通,学会合作,学会高效工作。要时刻记着浪费别人的时间就是 谋财害命!

最后一点,也是最重要的一点,高度认真负责。这是参与开源社区最最关键的一点。

推荐另一篇必读的入门文章[11]。

[1] http://vger.kernel.org/vger-lists.html#linux-kernel
[2] http://www.youtube.com/watch?v=L2SED6sewRw
[3] http://www.heise-online.co.uk/open/Kernel-Log-More-than-10-million-lines-of-Linux-source-files--/news/111759
[4] http://en.wikipedia.org
[5] http://www.kerneltravel.net
[6] http://kernel.org
[7] http://wiki.zh-kernel.org/
[8] http://www.cnkernel.org/note/tester.tar.bz2.pdf (注意:是个压缩包,下载后把.pdf后缀去掉)
[9] http://bugzilla.kernel.org
[10] http://www.kernel.org/pub/software/scm/git/docs/
[11] http://xiyoulinux.cn/wiki/index.php?title=内核入门

3 thoughts on “写给像我一样的Linux内核初学者

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.