Linux内核:源代码

本文介绍了Linux内核源代码的组织结构,包括主要的文件夹和文件的作用。如:COPYING阐述了GPLv2协议,Kbuild和Makefile用于编译设置,arch文件夹包含各种处理器结构的代码,drivers文件夹包含驱动程序,fs文件夹包含文件系统代码等。内核源代码的结构有助于开发者理解和导航。
摘要由CSDN通过智能技术生成

本文译自Linux.orgDevynCJohnson的系列文章《Linux内核》,本篇链接:http://www.linux.org/threads/the-linux-kernel-the-source-code.4204/,转载请注明出处及原作者。
前文中我们简要地介绍了Linux内核的一些概念和定义,在下载并解压了Linux内核的源代码之后,我们会发现许多文件夹和文件。想要在其中找出一个特定的文件是十分困难的,不过幸运的是,这些源代码以一种特定的方式被组织编排了,这使得开发者寻找与内核特定模块相关的文件成为可能。

注:我们可以在解压后的源代码根目录下输入ls来获取文件的列表。

除了文件夹以外,还有一些其他的文件位于源代码的根目录下。他们名称及作用如下所示:
注:在这一段中,由于内核的不同,并不是所有的文件都存在。

COPYING - 关于协议和权力的信息,Linux的内核是基于GPLv2协议的。这一协议给予所有人使用,修改,发放以及免费分享和编译代码的权力。而且任何人都不能出手源代码。

CREDITS - 贡献者名单

Kbuild - 一个为制作内核而进行设定设置的脚本,例如,如果用户希望他的内核支持ARCH处理器的话,这个脚本就会设置ARCH变量。

Kconfig - 这个脚本文件是用于开发者配置内核,在之后的文章中我们会涉及到。

MAINTAINERS - 该文件是当前的系统维护者的名字,email地址,网站以及他们所负责的文件或模块的列表。当开发者发现了内核中的bug并且愿意将这一发现汇报给维护者时,开发者可以查询本文件获得相关信息。

Makefile - 该文件是编译内核的主要文件,其为编译器传递参数,文件列表以及其他必要的信息。

README - 该文件是编译内核的指导。

REPORTING-BUGS - 这个文件指导开发者们如何汇报bug。

Linux内核的源代码都存储在以.c和.h为后缀的文件中,也就是说内核是基于C语言开发的。”.h”文件是头文件,也是通过C编写的。头文件中包含了许多”.c”文件中用到的代码,这节省了开发者的时间。否则一份通用的代码就要包含在各个”.c”文件中。与此同时也会消耗和浪费硬盘空间。

所有的源文件都被放于相应的文件夹中,文件夹的名称也有助于开发者了解该文件夹中包含文件的内容。接下来我们来介绍一下这些文件的结构:
arch - 这个文件夹包含一个Kconfig文件,用于设置编译环境。所有支持的处理器结构都在相应的文件夹中。例如,Alpha处理器的源代码存放在alpha文件夹中。随着时间的退役,会出现处理器的更替,一些新的处理器会出现在这个文件夹中,而旧的处理器被移除。

block – 这个文件夹中包含块设备驱动程序的代码。块设备是以块为单位接收和发送数据的。数据块是一整块数据而非连续的数据流。

crypto - 这个文件夹包含许多加密算法的源代码。例如”sha1_generic.c”就包含sha1加密算法的代码。

Documentation - 这个文件夹包含了纯文本文档,他们提供了内核以及许多文件的信息,开发者可以通过查询这个文件夹中的文件来获得更多信息。

drivers - 该文件夹包含了驱动程序的代码。驱动程序是控制硬件的程序。例如,计算机需要键盘的驱动程序来理解和支持键盘操作。在这个文件夹中有许多子文件夹,每个文件夹的名字都以他们支持的硬件明明。比如说名为”bluetooth”的文件夹包含蓝牙驱动程序的代码。其他一些明显的诸如scsi,usb,以及FireWire。还有一些驱动可能比较难找到,比如说joystick的驱动就不在joystick文件夹中,它位于/drivers/input/joystick之中。键盘和鼠标的驱动都在这个名为输入的文件夹中。名为Macintosh的文件夹包含了苹果硬件的驱动,xen文件夹包含了Xen管理程序的驱动。管理程序是指支持用在同一台计算机上运行不同的操作系统的软件或硬件。我们会在之后的文章中详细地描述这些文件夹所支持的文件。

firmware - firmware(组件)文件夹包含支持计算机读和理解其他设备信号的代码。例如,摄像头可以控制其硬件,但是计算机必须理解源自于摄像头的信号。Linux系统就会用vicam组件来解析这些信号。否则Linux系统就无法处理源自于摄像头的这些信号。当然,组件也帮助Linux系统发送消息给设备。Linux系统也可以告诉摄像头对焦或关闭。

fs - 这个是文件系统文件夹,所有理解和应用文件系统的代码都在这里。在这个文件夹中,每个文件系统都在各自的文件夹中。比如说ext4文件系统的源代码就在ext4文件夹中。在fs文件夹中,开发者们会发现有些文件不在哪里。但他们依然处理文件系统,例如,mount.h就包含mount文件系统的源代码,文件系统是指通过结构化的方式将文件或是文件夹保存在存储设备上。文件系统都各有千秋,这是由于编写方式的不同而造成的。比如说NTFS文件系统支持透明压缩(文件会被自动压缩而不通知用户)。多数文件系统都没有这一特性。

include - include文件夹包含了各式各样内核用到的头文件,文件夹的名称源自C语言的include语法。

init - 该文件夹包含了内核的启动代码,main.c是内核的核心,该文件将所有其他源文件链接起来。

ipc - IPC指的是进程内通信,该文件夹中的代码处理内核与进程之间的通信层。内核控制着硬件,程序仅能够通过内核来执行任务。假定用户执行一个打开DVD舱门的程序,并非程序直接打开了舱门,而是程序通知内核舱门需要被打开,然后内核通过向硬件发信号的形式大爱舱门。这些代码同样也处理kill信号,当系统管理员发出kill信号,内核收到这一信号就会像程序发出停止指令或直接将该程序清除出内存和CPU(依内核种类而定)。在命令行中的Pipe指令也是如此,pipe指令通知内核将输出数据置于内存中的物理页。接收这一数据的程序或指令就会获得指向存储了这些数据的内存页的指针。

kernel - 内核的源代码就在这个文件夹中,例如一个debugger需要追溯一个问题,这个文件夹中的代码就会为其提供内核所有的行为。其中还包括记录时间的代码。在kernel文件夹中还有一个文件夹名为power,一些负责计算机重启,关机以及挂起的代码就在这个文件夹中。

lib - 内核运行库就存放在这个文件夹中。

mm - 该文件夹中包含了内存管理相关的代码。内存并不是随机分布于RAM上的,相反地,他是遵循着一定的规则将数据存储于RAM上。内核不会将正在使用或者保存着重要信息的内存块覆盖掉。

net - 该文件夹包含网络协议的代码, 其中包括IPV6, Appletalk,Ethernet,wifi,Bluetooth等等协议。还有网桥以及DNS命名规则的代码也在其中。

samples - 这个文件夹中包含了一些刚刚开始开发的例子和模块。如果在一个新的模块中有一个新功能的需求但是没有开发者声明开发这一功能,这些模块就会被放在这个文件夹中,这给kernel程序员新手们一个机会来浏览这个文件夹并且从中挑选一个模块来协助开发。

scripts - 这个文件夹中包含了用于编译内核的脚本文件,最好不要改动这些文件,否则肯能无法配置或编译内核。

security - 这个文件夹包含内核安全性相关的代码,保护计算机免受病毒和黑客的攻击是十分重要的。否则Linux系统有可能被损坏,有关Linux的安全性问题也会在之后的文章中探讨。

sound - 这个文件夹包含声卡、显卡的驱动程序代码。

tools - 该文件夹包含了与内核交互的工具。

usr - 还记得之前文章中提到过的vmlinuz或相似的文件吗?这个文件夹中的代码在编译过程中产生那些文件。

virt - 这个文件夹中的代码支持虚拟化,也就是用户同时运行多个操作系统。与Xen不同的是,虚拟化使得子系统能够像主系统Linux一样的运行,但是诸如Xen一类的管理程序,两个操作系统则是在同时控制硬件。虚拟化的子系统是运行于Linux之上的,然而就管理程序而言,没有所谓的子系统,并且所有的操作系统之间并无依存关系。

注:请不要随意移动kernel中的代码,否则有可能无法编译。

Linux内核的文件结构是相对固定的,内核开发者们虽然对于源代码进行了改变,但是总的来讲,不同版本的内核安装起来大致相同。驱动程序的文件夹结构也大致相同,下一篇文章我们就来聊聊内核驱动

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值