Linux内核源码分析方法

发表于:2013-3-25 13:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Florian    来源:51Testing软件测试网采编

  一、内核源码之我见

  Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些人都可以称得上一顶一的代码高手。透过阅读Linux内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。

  我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知:

  1、内核源码的分析并非“高不可攀”。内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。内核的庞大致使我们不能按照分析一般的demo程序那样从主函数开始按部就班的分析,我们需要一种从中间介入的手段对内核源码“各个击破”。这种“按需索取”的方式使得我们可以把握源码的主线,而非过度纠结于具体的细节。

  2、内核的设计是优美的。内核的地位的特殊性决定着内核的执行效率必须足够高才可以响应目前计算机应用的实时性要求,为此Linux内核使用C语言和汇编的混合编程。但是我们都知道软件执行效率和软件的可维护性很多情况下是背道而驰的。如何在保证内核高效的前提下提高内核的可维护性,这需要依赖于内核中那些“优美”的设计。

  3、神奇的编程技巧。在一般的应用软件设计领域,编码的地位可能不被过度的重视,因为开发者更注重软件的良好设计,而编码仅仅是实现手段问题——就像拿斧子劈柴一样,不用太多的思考。但是这在内核中并不成立,好的编码设计带来的不光是可维护性的提高,甚至是代码性能的提升。

  每个人对内核的了理解都会有所不同,随着我们对内核理解的不断加深,对其设计和实现的思想会有更多的思考和体会。因此本文更期望于引导更多徘徊在Linux内核大门之外的人进入Linux的世界,去亲自体会内核的神奇与伟大。而我也并非内核源码方面的专家,这么做也只是希望分享我自己的分析源码的经验和心得,为那些需要的人提供参考和帮助,说的“冠冕堂皇”一点,也算是为计算机这个行业,尤其是在操作系统内核方面贡献自己的一份绵薄之力。闲话少叙(已经罗嗦了很多了,囧~),下面我就来分享一下自己的Linix内核源码分析方法。

  二、内核源码难不难?

  从本质上讲,分析Linux内核代码和看别人的代码没有什么两样,因为摆在你面前的一般都不是你自己写出来的代码。我们先举一个简单的例子,一个陌生人随便给你一个程序,并要你看完源码后讲解一下程序的功能的设计,我想很多自我感觉编程能力还可以的人肯定觉得这没什么,只要我耐心的把他的代码从头到尾看完,肯定能找到答案,并且事实确实是如此。那么现在换一个假设,如果这个人是Linus,给你的就是Linux内核的一个模块的代码,你还会觉得依然那么轻松吗?不少人可能会有所犹豫。同样是陌生人(Linus要是认识你的话当然不算,呵呵~)给你的代码,为什么给我们的感觉大相径庭呢?我觉得有以下原因:

  1、Linux内核代码在“外界”看来多少有些神秘感,而且它很庞大,猛地摆在面前可能感觉无法下手。比如可能来源于一个很细小的原因——找不到main函数。对于简单的demo程序,我们可以从头至尾的分析代码的含义,但是分析内核代码这招就彻底失效了,因为没有人能把Linux代码从头到尾看上一遍(因为确实没有必要,用到时看就可以了)。

  2、不少人也接触过大型软件的代码,但多数属于应用型项目,代码的形式和含义都和自己常接触的业务逻辑相关。而内核代码不同,它处理的信息多数和计算机底层密切相关。比如操作系统、编译器、汇编、体系结构等相关的知识的欠缺,也会让阅读内核代码障碍重重。

  3、分析内核代码的方法不够合理。面对大量的并且复杂的内核代码,如果不从全局的角度入手,很容易陷入代码细节的泥淖中。内核代码虽然庞大,但是它也有它的设计原则和架构,否则维护它对任何人来说都是一个噩梦!如果我们理清代码模块的整体设计思路,再去分析代码的实现,可能分析源码就是一件轻松快乐的事情了。

  针对这些问题,我个人是这样理解的。如果没有接触过大型软件项目,可能分析Linux内核代码是一个很好的积累大型项目经验的机会(确实,Linux代码是我目前接触到的最大的项目了!)。如果你对计算机底层了解的不够透彻,那么我们可以选择边分析边学习的方式去积累底层的知识。可能刚开始分析代码的进度会稍显迟缓,但是随着知识的不断积累,我们对Linux内核的“业务逻辑”会逐渐明朗起来。最后一点,如何从全局的角度把握分析的源码,这也是我想与大家分享的经验。

  三、内核源码分析方法

  第一步:资料搜集

  从人认识新事物的角度来讲,在探索事物本质之前,必须有一个了解新鲜事物的过程,这个过程是的我们对新鲜事物产生一个初步的概念。比如我们想学习钢琴,那么我们需要先了解弹奏钢琴需要我们学习基本的乐理、简谱、五线谱等基础知识,然后学习钢琴弹奏的技巧和指法,最后才能真正的开始练习钢琴。

  分析内核代码也是如此,首先我们需要定位要分析的代码涉及的内容。是进程同步和调度的代码,是内存管理的代码,还是设备管理的代码,还是系统启动的代码等等。内核的庞大决定着我们不能一次性将内核代码全部分析完成,因此我们需要给自己一个合理的分工。正如算法设计告诉我们的,要解决一个大问题,首先要解决它所涉及的子问题。

  定位好要分析的代码范围,我们就可以动用手头的一切资源,尽可能的全面了解该部分代码的整体结构和大致功能。

  这里所说的一切资源是指无论是Baidu、Google大型网络搜索引擎,还是操作系统原理教材和专业书籍,亦或是他人提供的经验和资料,甚至是Linux源码提供的文档、注释和源码标识符的名称(不要小看代码中的标识符的命名,有时它们能提供关键的信息)。总之这里的一切资源指的就是你能想到的一切可用资源。当然,我们不太可能通过这种形式的信息搜集获得所有的我们想要的信息,我们只求尽可能全面即可。因为信息搜集的越全面,之后分析代码的过程能使用的信息就更多,分析过程的困难就会越小。

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号