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

Linux内核:源代码相关推荐

  1. linux 内核源代码漫游,Linux内核源代码漫游——

    Linux内核源代码漫游 Alessandro Rubini著, rubini@pop.systemy.it 赵炯 译,gohigh@shtdu.edu.cn 本章试图以顺序的方式来解释Linux源代 ...

  2. Linux内核源代码获取方法

    Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UN ...

  3. Linux系统 proc self,Linux内核源代码情形分析-特殊文件系统/proc-对/proc/self/cwd的访问...

    Linux内核源代码情景分析-特殊文件系统/proc-对/proc/self/cwd的访问 继上篇文章Linux内核源代码情景分析-特殊文件系统/proc,我们对/proc/loadavg访问后,这篇 ...

  4. Linux 内核源代码的目录结构

    Linux 内核源代码的目录结构 Linux 内核源代码包含如下目录. ● arch :包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386.arm. arm64.powerpc.mip ...

  5. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  6. Linux内核源代码分析-目录

    第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...

  7. python源码提取_Python提取Linux内核源代码的目录结构实现方法

    今天用Python提取了Linux内核源代码的目录树结构,没有怎么写过脚本程序,我居然折腾了2个小时,先是如何枚举出给定目录下的所有文件和文件夹,os.walk可以实现列举,但是os.walk是只给出 ...

  8. linux内核源代码_如何从源代码构建和安装最新的Linux内核

    linux内核源代码 by Sreehari 通过Sreehari 如何从源代码构建和安装最新的Linux内核 (How to build and install the latest Linux k ...

  9. 《深入分析Linux内核源代码》读书、私藏笔记大放送

    秉承着"不懂操作系统原理的程序员不是合格的程序员"的至理名言,鄙人又是买陈莉君老师的"Linux教学视频",又是研读其力作<深入分析Linux内核源代码& ...

  10. linux 虚拟文件系统 源码,Linux内核源代码情状分析-虚拟文件系统

    Linux内核源代码情景分析-虚拟文件系统 我们先来看两张图: 第一张是VFS与具体文件系统的关系示意图: 第二张是Linux文件系统的层次结构: 特殊文件:用来实现"管道"的文件 ...

最新文章

  1. mingw msys 编译 libzip
  2. npm与Yarn命令对比
  3. VC++、MFC、COM和ATL的区别
  4. 使用AJAX Toolkit创建新闻列表
  5. 拿什么来拯救你,电视!
  6. bzoj4423[AMPPZ2013]Bytehattan
  7. 详解ASIC设计流程
  8. 跑跑卡丁车rush服务器维护,跑跑卡丁车Rush+官网版
  9. Spark写入Hudi报分区列乱码问题java.net.URISyntaxException: Illegal character in path at index 46:
  10. mysql 检索结果排序方式_MySQL--排序检索数据(ORDER BY)
  11. css3 如何画太极 和 奥运五环
  12. getCause()、e.getMessage()产生的结果
  13. 计算机组成原理(5)CPU功能 控制器/运算器/寄存器/操作控制器、时序发生器 指令周期 方框图 微程序 流水CPU 三种相关性
  14. 新松机器人通过c++离线编程接口库控制运动失败的100个注意事项
  15. Android 二维码被扫后接收通知(使用MQTT协议实现消息推送)
  16. psp 6.61降级到_将电视挤到您的PSP上
  17. Web漏洞-SSRF漏洞(详细)
  18. Radmin密码破解
  19. 18家银行的数字化转型行动
  20. 不在沉默中爆发就在沉默中死亡,处于沉寂状态的 Emotet 僵尸网络是怎样卷土重来的?(一)

热门文章

  1. Python代码实战(初级篇)————7、斐波那契数列
  2. Linux中系统引导过程各类问题的修复方法
  3. C# Linq介绍和使用
  4. Excel身份证号码格式怎么设置?盘点六种设置方法
  5. JavaScript基础教程(第9版)
  6. 进入大厂需要学习的python技能
  7. react native APP启动页
  8. Java21届秋招面试题总结-网络篇
  9. JavaScript删除元素removeChild
  10. 木马程序的配置和使用实验