Linux内核开发  - 讨论区

标题:[zeuux-linux] 写给想我一样的Linux内核初学者

2008年11月12日 星期三 18:53

Jianjun Kong kongjianjun在gmail.com
星期三 十一月 12 18:53:01 CST 2008

今天在小组大概讲了一下,自己学习内核的感受,总结了一下贴出来。欢迎任何评议 :)
_____________________________________________________

                         写给像我一样的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手册、wikipaid[4]等在线文档解决遇到的问题,参与合适的国外邮件列表,参与一些
英文交友社区(如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目录下找到)、WangCong的内核讲座PPT[8]、Linux内核测试指南[9]。

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

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

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

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

-- 
Jianjun Kong @_@ Happy Hacking
Homepage: http://kongove.cn/
Gtalk: kongjianjun在gmail.com

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-linux]

2008年11月12日 星期三 19:19

Américo Wang xiyou.wangcong在gmail.com
星期三 十一月 12 19:19:04 CST 2008

On Wed, Nov 12, 2008 at 06:53:01PM +0800, Jianjun Kong wrote:
>今天在小组大概讲了一下,自己学习内核的感受,总结了一下贴出来。欢迎任何评议 :)
>_____________________________________________________
>
>                         写给像我一样的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手册、wikipaid[4]等在线文档解决遇到的问题,参与合适的国外邮件列表,参与一些


很明显应该是wikipedia。


>英文交友社区(如Facebook等),交笔友、IRC频道及时聊天都是不错的方法。这些途径基
>本上都是和技术沾边的,当然也有很多其他方法提高英语水平。


提高英语水平的最好方法是说,因为读写听说里面说是要求最高的。

当然了,国内可能没有那么好的环境,不过你仍然可以通过阅读来提高自己的读写水平,
我个人的体会是:多读英文原版的计算机书,一来能够学习计算机知识,二来又能提高英语,
何乐而不为?这比交什么笔友强多了!


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


书只是辅助,最重要的还是自己得去阅读源代码,Herbert Xu的经验是非常非常正确!!



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


Linux多次被拼错,不知道你是否用认真的态度来写本文。。。


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


可直接阅读最新的git里的代码。


>
>如果在学习内核的同时,你想尝试参与真正的Linux内核开发,请继续往下读。首先了解内
>核开发的大牛,搞清楚Linus Torvalds, Andrew Morton, David Miller等主要维护者的工
>作内容,如果你想作ARM方面的开发,你还得知道Russell King,你可以通过MAINTAINER文

Russell King的贡献远不止ARM。。。。


>件了解更多子系统的维护者,当然不是全部要了解。其次你得理解内核的命名规则,以及


你的意思应该是内核编码风格才对。


>如何制作和提交补丁。从而熟悉内核开发的现状和流程,更加有效的跟踪Linux内核开发,
>同时坚定自己的信心。这样你的工作才能真正进入Linux内核当中。这里推荐一些资料,内
>核文档(HOWTO、SubmittingPatches、SubmittingDrivers等,都可以从内核源码
>Documentation目录下找到)、WangCong的内核讲座PPT[8]、Linux内核测试指南[9]。


我的ppt过时了,忽略。


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


这取决于你如何定义“浪费”时间。



-- 
"Sometimes the only way to stay sane is to go a little crazy."


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-linux]

2008年11月12日 星期三 20:19

Jianjun Kong kongjianjun在gmail.com
星期三 十一月 12 20:19:17 CST 2008

On Wed, Nov 12, 2008 at 11:19:04AM +0000, Américo Wang wrote:
>On Wed, Nov 12, 2008 at 06:53:01PM +0800, Jianjun Kong wrote:
>>今天在小组大概讲了一下,自己学习内核的感受,总结了一下贴出来。欢迎任何评议 :)

谢谢你的回复!
我会把最新版本更新到:http://kongove.cn/web/doc/kernel-newbies.html
>>_____________________________________________________
>>
>>                         写给像我一样的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手册、wikipaid[4]等在线文档解决遇到的问题,参与合适的国外邮件列表,参与一些
>
>
>很明显应该是wikipedia。
>
>
>>英文交友社区(如Facebook等),交笔友、IRC频道及时聊天都是不错的方法。这些途径基
>>本上都是和技术沾边的,当然也有很多其他方法提高英语水平。
>
>
>提高英语水平的最好方法是说,因为读写听说里面说是要求最高的。
>
>当然了,国内可能没有那么好的环境,不过你仍然可以通过阅读来提高自己的读写水平,
>我个人的体会是:多读英文原版的计算机书,一来能够学习计算机知识,二来又能提高英语,
>何乐而不为?这比交什么笔友强多了!

有时候人与人的交流会得到书本中没有的很多东西。

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

ACK

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

有吗?不要告诉我葡萄牙语Linux不这么拼~ ;)

>>在学习内核过程中,源代码是最好的参考资料,你可以从Linux内核官网[6]下载最新的内
>>核源码,也可以选取交老的版本分块阅读。内核源码的阅读,难就难在整体的一个把握上
>>,所以建议大家先选取局部核心数据结构、代码、文件进行分析,如task_struct结构体、
>>fork.c文件等。在阅读源码的同时,结合一些较小的实例程序练习,从而真正理解源码。
>>在学习过程中如果遇到问题,最好现查看手头和网上的资料,实在解决不了,可以去邮件
>>列表(中文内核邮件列表[7])。
>
>
>可直接阅读最新的git里的代码。
>
>
>>
>>如果在学习内核的同时,你想尝试参与真正的Linux内核开发,请继续往下读。首先了解内
>>核开发的大牛,搞清楚Linus Torvalds, Andrew Morton, David Miller等主要维护者的工
>>作内容,如果你想作ARM方面的开发,你还得知道Russell King,你可以通过MAINTAINER文
>
>Russell King的贡献远不止ARM。。。。
>
>
>>件了解更多子系统的维护者,当然不是全部要了解。其次你得理解内核的命名规则,以及
>
>
>你的意思应该是内核编码风格才对。

版本命名规则

>>如何制作和提交补丁。从而熟悉内核开发的现状和流程,更加有效的跟踪Linux内核开发,
>>同时坚定自己的信心。这样你的工作才能真正进入Linux内核当中。这里推荐一些资料,内
>>核文档(HOWTO、SubmittingPatches、SubmittingDrivers等,都可以从内核源码
>>Documentation目录下找到)、WangCong的内核讲座PPT[8]、Linux内核测试指南[9]。
>
>
>我的ppt过时了,忽略。
>
>
>>
>>你得学会利用内核Bug的跟踪系统Bugzilla[10]工作,学会使用Git版本控制工具,理解树
>>的概念。使用Git来跟踪内核的开发,关于Git的使用请阅读Git的帮助手册[11]。Git工具
>>、邮件列表等的使用,其实质是学会沟通,学会合作,学会高效工作。要时刻记着浪费别
>>人的时间就是谋财害命!
>
>
>这取决于你如何定义“浪费”时间。
>"Sometimes the only way to stay sane is to go a little crazy."

这也取决于读者如何理解“浪费”时间。


-- 
Jianjun Kong @_@ Happy Hacking
Homepage: http://kongove.cn/
Gtalk: kongjianjun在gmail.com

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-linux]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号