查看: 2834|回复: 5
打印 上一主题 下一主题

浅谈阅读LINUX内核源码

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-5 09:16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大三选择向嵌入式方向发展,主要学习linux的驱动开发,期间网上各种资料显示阅读linux内核源码(下面简称内核源码)的重要性,于是我便走上了这条不归路。在这篇文章中,我想讲三个内容,一是阅读内核源码有什么用,二是如何阅读内核源码,三是谈一下我阅读内核源码的经历:
    首先声明我对linux内核源码并不精通,也不算熟悉(虽然在简历中我曾写着阅读过linux内核源码(0.11版本)),下面的内容全凭我自身在真正开始学习linux一年多后的经历和感受,与大家分享,如有错误欢迎大家批评指正,但是拒绝脏话、拒绝抬杠。
一、读linux内核源码有什么用?
    大家在阅读之前都会思考这个问题,我baidu+google,发现很少有人提问学习内核源码有什么用?提问最多的是如何阅读内核源码,回答者的答案几乎类似(两种方法,第二部分叙述)。但是回答者很少关心你为什么要读内核源码。由此我得出下面2点结论:
    1.大家也许也不是很清楚自己为什要读内核源码;
    2.大家希望找到一条高效的捷径快速完成与读内核源码;
    我当时想要阅读源码其实也没有什么明确的目的,因为当我学习驱动开发时,驱动程序中要包含各种头文件,会遇到各种定义好的结构和接口,阅读别人的驱动程序时,会有注释和说明。但是当自己写驱动程序时,真心是无从下手。我知道驱动要实现那些内核的接口,但是需要包含哪些头文件、要用到那些封装好的结构确实要各种搜索。在这样的背景下,我萌生了阅读内核源码的想法,这样在实现驱动程序时就会很轻松,并憧憬这在完全阅读源码后可以写一个自己的操作系统(目前我仍然憧憬着,这是我的梦想之一)。
    做了一些了解后我决定先阅读0.11版本的源码,一是希望可以借此对整个操作系统如何驱动硬件进行工作有一个从宏观到微观的了解,二是希望之后可以写一个自己的操作系统在ARM9上跑起来,这已经有点背离了我最初的目的——为驱动开发做基础。
    从开始阅读源码到现在,中间断断续续。不是我不能坚持,因为平时要上课,期末要考试,暑假实习+找工作,只能用零头时间读,时间久了就会不断问自己这样下去有意义吗?工作中会用到吗?这样很容易就会放弃,然后某段时间心血来潮又继续读。
    我想大家都将会遇到这样的情况或者已经遇到过。我想说——
    坚持阅读内核源码肯定很有用,但是我不知道有什么用,因为我不知道自己能够不能够坚持读完。读完0.11应该没问题,但是0.11和2.6.X的内容差的太多了(完全不一样),现在内核中保留的也许只是0.11的思想。那么读完0.11有什么用,对驱动开发没用,对编程能力没有提高,对行业了解没有帮助......我现在在读2.6.20的源码,但是只是希望可以加深对内核的了解,算是爱好吧。
    网上回答如何阅读源码的帖子铺天盖地,但是为什么总是有人不断地提问,这反映了大家的浮躁心理,希望可以找到一条高效的捷径快速完成目标——不可能的,踏踏实实,一步一步的来吧。
回复

使用道具 举报

板凳
 楼主| 发表于 2014-8-5 09:16:33 | 只看该作者
二、如何阅linux内核源码
    上面说到了,网上讲的阅读内核的方法机会一致,就是下面两种方法:
    1.bochs+linux0.11+书(linux内核完全注释|linux内核完全剖析|linux内核设计的艺术)
    2.sourcesinsight+linx2.X+书(linux内核情景分析)
    阅读源码分为纵向阅读和横向阅读。纵向就是跟着内核的执行流程来读,横向就是按照内核的各大功能模块来读。第一种方法纵向或者横向来读都可以,因为代码量不是很大。《linux内核完全剖析》《linux内核完全注释》是引导你横向阅读的书,《linux内核设计的艺术》是引导你纵向阅读的书。个人经验可以横向纵向结合着来,纵向跟着bochs调试工具来是必不可少的,当遇到问题时进入到相应的功能模块横向拓展一下。
    《linux内核情景分析》中的内核版本是2.4.X,现代内核版本还是推荐横向阅读,纵向几乎不可能。我在Linux下搭建了quem虚拟机,然后用GDB调试内核也可以。
    总之阅读源码的方法也就上面两种,贵在坚持,但是别闭门N久学内核,没有意义。而且长时间只读代码,不敲代码是不行的。
三、谈一下我阅读内核源码的经历
    找工作之前我读0.11版本的内核,对找工作一点帮助都没有。当时想着阅读过linux内核源码的经历可以给我的工作增添一些筹码,但事实并非如此,特别是读的是0.11版本的,和现代版本差别忒大了,你说的面试官都不知道。我去一家公司面试时,面试官问我Linux的线性地址空间如何布局,其实就是最高1G是内核空间,从开始到3G是用户空间。当时我确实不知道。0.11里面也根本不是这样实现的,加上我最开始是纵向阅读,对功能模块了解的不够深入,我就讲了0.11如何实现页面管理,面试官当然不认账。最后简历上写着实习经历有两个月,这两个月中我忙着准备找工作,说实话实习在项目并没有什么大的贡献。面试官抓住这两点开始强烈的鄙视我,我的第一次面试就这样结束了,出来之后心情很不好,不过自己当时表现的也很不实在,总想拿0.11版本的内核源码说事——话题扯远了。就是想告诉大家,如果想在简历中写上关于linux内核的经验,先不要花大量时间看源码了,先把《linux内核设计与实现》读了,在找工作中更有用。
回复 支持 反对

使用道具 举报

地板
发表于 2014-8-5 09:34:22 | 只看该作者
虽然我不懂,但是作者的经验分享我还是很赞同的,这年头向作者这样的好人已经不多了。
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-8-5 09:35:21 | 只看该作者
{:soso_e183:}
回复 支持 反对

使用道具 举报

5#
发表于 2014-8-5 12:20:06 | 只看该作者
楼主{:soso_e129:}
回复 支持 反对

使用道具 举报

6#
发表于 2014-8-6 09:32:20 | 只看该作者
楼主这两天挺忙的,好东西不断
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表