linux源码学习(linux源代码详解)
本文目录一览:
怎样学习并研究LINUX的源码
学习linux最好也最值得去学的是源码分析,因为只有做好了这项工作,才能搞操作系统,尤其是嵌入式系统——一个现在包括以后的很长一段时间内会是一个很热门的东西。可以说LINUx是中国的系统软件,包括嵌入式系统,开发自己的系统,在计算机领域打出一片自己的天下的很好的契机。
有一本书很值得一看,是赵炯的《Linux内核完全注释》,我有电子版本,但太大了,如果你需要可以给我发信息。我可以传给你。不过我还是喜欢看纸版的书,因此我又买了一本。
你也可以去买一本,相信我,这本书很值得买的。
linux内核源代码怎么看?
一般在Linux系统中的/usr/src/linux*.*.*(*.*.*代表的是内核版本,如2.4.23)目录下就是内核源代码(如果没有类似目录,是因为还没安装内核代码)。另外还可从互连网上免费下载。注意,不要总到去下载,最好使用它的镜像站点下载。请在里找一个合适的下载点,再到pub/linux/kernel/v2.6/目录下去下载2.4.23内核。
代码目录结构
在阅读源码之前,还应知道Linux内核源码的整体分布情况。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,其组成如下(假设相对于Linux-2.4.23目录):
1.arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
2.include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。
3.init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
4.mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
5.drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
6.ipc目录包含了核心进程间的通信代码。
7.modules目录存放了已建好的、可动态加载的模块。
8.fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
9.net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
10.lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
11.scripts目录包含用于配置核心的脚本文件。
12.documentation目录下是一些文档,是对每个目录作用的具体说明。
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。
在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行。对于Linux启动的代码可顺着Linux的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解。
懂Linux编程的进,如何学习源代码?
对于学习源代码,我不知道你学的是应用开发上的开源项目代码还是linux内核开发的内核源代码,但是对于学习源代码方面,他们套路是相通的,我以应用开为例说明吧。譬如说我的毕业设计是做是基于SIP协议的VOIP网络语音,当然我使用的也是国外开源项目,因为之前对它不熟悉导致自己也很折腾,据我的总结,学习开源项目的过程应该是这样的:
这个开源项目肯定有别人做了的,先百度或者谷歌看看别人有什么好的建议,这个很重要。所谓一个萝卜一个坑,你遇到的问题别人也基本遇到。主要是,通过别人的文章让你知道它的框架是什么,我们改的是什么地方。
如果你不嫌麻烦,你可以看开源项目的readme(读我)文件,这个readme文件一般是作者写的(老外的开源项目基本是英文,并且又长又臭-.-),只有这个开源项目刚出来时,大家都对这个项目不了解才会这样做,如果我们直接看readme文件,然后对开源项目进行修改的话,不是很现实(readme太长了,看了两次基本和没看没区别,因为我试过)。
在你大致了解了整个开源项目后,你就会知道要改什么地方,你要注意了,不要过于急躁,一点一点的改,并且一点一点的进行调试,不然,后面出了问题,你不知道是哪里错了,这个很重要。
譬如说,我最开始学uboot,uboot用于引导linux内核,这个uboot是德国的一个开源项目,很流行的。问题是,这个项目代码非常多,我也无从下手,你让我看人家的readme文件那是不可能,全英文并且字数太多了,我是通过baidu,看看大牛写的文章对uboot的框架有了总体认识,也知道怎么改了,照着别人的博文进行操作,基本都不会有问题,这就是套路!不管是对应用开发还是对内核开发也是一样的。让自己一穷二白的开作者的readme文件,不是说不行,只是说折腾,这就是我的套路,反正学linux驱动我就这样做的,感觉学的挺好的。。
如何准备阅读Linux源码
阅读linux源代码要掌握一定的386硬件知识,ATT汇编语言结构,操作系统原理等等基础知识。但是及时掌握这些知识读懂源码还是很困难的(当然掌握操作系统原理也是一件不容易的事情),建议你先去看一下u/cos源代码,根据其源代码试着自己给51单片机写一个小的分时操作系统,移植到单片机上试试效果。然后再根据对u/cos理解自己写一个自己的u/cos,并移植到arm7平台上,一步一步来。。。。。。总之linux操作系统是一个很复杂的软件,它不仅仅要求你对大型软件架构有很深入的认识,还要求你对硬件的操作非常熟悉,我们经常看到在linux系统中常常会有汇编语言与c语言的嵌套。阅读linux源代码不是一件容易的事情,要不断的学习,让我们一起来努力吧!