Linux的最大的用处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的笔记本爱好者和程序员;她们把剖析和剖析Linux的核心源码作为自己的
最通州趣,把更改Linux源码和改建Linux系统作为自己对计算机技术追求的最大目标。
Linux内核源码是很具吸引力的,非常是当你看懂了一个剖析了很久都没看懂的问题;或则是被你更改过了的内核linux内核源码剖析,顺利通过编译,一切运行正常的时侯。
那个成就感真是油但是生!并且,对内核的剖析,不仅出自对技术的狂热追求之外,这些令人生畏的劳动所带来的回报也是十分令人着迷的,这也正是它拥有诸多追
随者的主要缘由:
首先,你可以从小学到好多的计算机的底层知识,如前面将提到的系统的引导和硬件提供的中断机制等;其它,象虚拟储存的实现机制,多任务机制,系统保护
机制等等,这种都是非都源码不能感受的。
同时,你还将从操作系统的整体结构中,感受整体设计在软件设计中的分量和作用,以及一些宏观设计的方式和方法:Linux的内核为下层应用提供一个与
具体硬件不相关的平台;同时在内核内部,它又把代码分为与体系结构和硬件相关的部份,和可移植的部份;再比如linux内核源码剖析,Linux其实不是微内核的,但他把大部份
的设备驱动处理成相对独立的内核模块linux c,这样减少了内核运行的开支,提高了内核代码的模块独立性。
但是你能够从对内核源码的剖析中,感受到它在解决某个具体细节问题时,技巧的巧妙:如前面将剖析到了的Linux通过Botoom_half机制来加
快系统对中断的处理。
最重要的是:在源码的剖析过程中,你将会被一点一点地、潜移默化地专业化。一个专业的程序员,总是把代码的清晰性,兼容性,可移植性置于很重要的位
置。她们总是通过定义大量的宏,来提高代码的清晰度和可读性,而又不降低编译后的代码宽度和代码的运行效率;她们总是在编码的同时,就考虑到了之后的代码
维护和升级。
甚至,只要剖析百分之一的代码后,你还会深刻地感受到,哪些样的代码才是一个专业的程序员写的,哪些样的代码是一个业余爱好者写的。而这一点是任何没有真
正剖析过标准代码的人都难以感受到的。
但是,因为内核代码的繁琐,和内核体系结构的繁杂,所以剖析内核也是一个很艰辛,很须要毅力的事;在缺少指导和交流的情况下,尤其这么。只有方式正
确,才会事半功倍。正是基于这些考虑,作者希望通过此文能给你们一些借鉴和启迪。
因为本人所进行的剖析都是基于2.2.5版本的内核;所以,假若没有非常说明,以下剖析都是基于i386单处理器的2.2.5版本的Linux内核。
所有源文件均是相对于目录/usr/src/linux的。
要剖析Linux内核源码,首先必须找到各个模块的位置,也即要读懂源码的文件组织方式。似乎对于有经验的前辈而言,这个不是很难;但对于好多中级的
Linux爱好者,和这些对源码剖析很有兴趣但接触不多的人来说,这还是很有必要的。
1、Linux核心源程序一般都安装在/usr/src/linux下,但是它有一个特别简单的编号约定:任何质数的核心(的二个数为奇数,比如
2.0.30)都是一个稳定地发行的核心,而任何质数的核心(比如2.1.42)都是一个开发中的核心。
2、核心源程序的文件按树状结构进行组织,在源程序树的最下层,即目录/usr/src/linux下有这样一些目录和文件。
◆COPYING:
GPL版权声明。对具有GPL版权的源代码改动而产生的程序,或使用GPL工具形成的程序,具有使用GPL发表的义务,如公开源代码。
◆CREDITS:光荣榜。对Linux作出过很大贡献的一些人的信息。
◆MAINTAINERS:维护人员列表,对当前版本的内核各部份都有谁负责。
◆Makefile:
第一个Makefile文件。拿来组织内核的各模块,记录了个模块间的互相这间的联系和依托关系,编译时使用;仔细阅读各子目录下的Makefile文件
对弄清各个文件这间的联系和依托关系很有帮助。
◆ReadMe:核心及其编译配置方式简单介绍。
◆Rules.make:各类Makefilemake所使用的一些共同规则。
◆REPORTING-BUGS:有关报告Bug的一些内容。
●Arch/:arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,比如i386就是关于intel
cpu及与之相兼容体系结构的子目录。PC机通常都基于此目录;
●Include/:include子目录包括编译核心所须要的大部份头文件。与平台无关的头文件在include/linux子目录下,与
intelcpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录。
●Init/:
这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心怎样工作的好的起点之一。
●Mm/:这个目录包括所有独立于cpu
体系结构的显存管理代码,如页式储存管理显存的分配和释放等;而和体系结构相关的显存管理代码则坐落arch//mm/,比如arch/i386/mm
/Fault.c。
●Kernel/:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代
码在arch//kernel中。
●Drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block
下为块设备驱动程序,例如ide(ide.c)。假如你希望查看所有可能包含文件系统的设备是怎样初始化的,你可以看drivers/block
/genhd.c中的device_setup()。它除了初始化硬碟,也初始化网路,由于安装nfs文件系统的时侯须要网路。
●Documentation/:文档目录,没有内核代码,只是一套有用的文档,可惜都是English的,瞧瞧应当有用的哦。
●Fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,比如fat和ext2。
●Ipc/:这个目录包含核心的进程间通信的代码。
●Lib/:放置核心的库代码。
●Net/:核心与网路相关的代码。
●Modules/:模块文件目录,是个空目录,用于储存编译时形成的模块目标文件。
●Scripts/:描述文件,脚本,用于对核心的配置。
通常,在每位子目录下,都有一个Makefile和一个Readme文件,仔细阅读这两个文件,对内核源码的理解很有用。
对Linux内核源码的剖析,有几个挺好的入口点:一个就是系统的引导和初始化,即从机器加电到系统核心的运行;另外一个就是系统调用,系统调用是用
户程序或操作调用核心所提供的功能的插口。对于这些对硬件比较熟悉的爱好者,从系统的引导入手进行剖析免费linux主机,可能来的容易一些;而从系统调用下口,则可能更合
易于这些在dos或Uinx、Linux下有过C编程经验的大神。
文章评论