Linux内核源码目录结构
Linux内核源码采用树形结构。功能相关的文件放到不同的子目录下面,使程序更具有可读行。如下图所示,可以看到源码目录。
下面我们来介绍每一个目录的作用。
1.arch目录是平台目录。处理器原厂提供一套Linux内核的源码,那么在这个目录下都有一套针对具体处理器CPU的子目录。每个CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别控制系统引导,内存管理,系统调用,动态调频,主频率设置部分等。在arch目录中有关键的平台文件。任何一款支持Linux的处理器,都有一部分内核代码是针对特定的处理器来提供的,具体的实现就是通过平台文件。以exynos4412为例,平台文件在arch/arm/mach-exynos/mach-tiny4412.c。
a.在arch/arm/boot目录,默认编译生成的内核镜像是在这个目录下。
b.在arch/arm/kernel目录中,有针对具体CPU处理器的代码,有相关内核特性实现方式,如信号处理等。这一部分当然是芯片厂商做好了,4412的这部分就是三星已经做好的部分。
c.在arch/arm/lib目录中,有一些和硬件相关库函数,后面学习驱动的时候会使用到。
d.在arch/arm/tools目录中,包含了生成镜像的工具。
e.在arch/arm/mm目录中,主要包含和体系相关的内存管理的具体实现。
2.block:块设备通用函数
3.crypto:内核中本身所用的加密API,实现了常见的加密和散列算法的C语言实现代码,譬如crc32、md5、sha1等
4.Document:提供文档帮助。关于内核的一些说明信息,在这个目录下会有帮助手册。
5.drivers:内核中所有设备的驱动程序,其中的每一个子目录对应一种设备驱动。此目录是内核中最庞大的目录,涵盖各种硬件的驱动程序,包含但不仅限于:显卡、网卡、PCI总线、USB总线及其他外网设备和总线的驱动。
6.firmware:固件代码,固化到IC里面运行的代码。
7.fs:Linux支持的文件系统代码,及各种类型的文件的操作代码。每个子目录都代表Linux支持的一种文件系统类型。文件系统是存储设备和访问存储设备的进程之间的桥梁。存储设备可以是物理设备,比如硬盘、CD-ROM,也可以是虚拟文件系统,比如proc
8.include:内核编译通用的头文件,包含与平台无关的目录include/linux和与平台相关的目录arch/arm/include
9.init:内核初始化的核心代码。包括main.c
10.ipc:内核中进程间的通信代码。包含共享内存、信号量、消息队列等各种IPC通信代码。
11.kernel:内核的核心代码,此目录下实现了大多数Linux系统的内核函数。主要包含:进程调度(sched.c),以及进程的创建和撤销(fork.c和exit.c),与处理器架构相关的内核代码在arch/$ARCH/kernel
12.lib:内核共用的函数库,与处理器架构相关的库在/arch/$ARCH/lib。比如常见的字符串函数,打印输出函数等。
13.mm:内存管理代码,此目录包含与平台体系无关的内存管理,譬如页式存储管理内存的分配和释放等。与具体处理器架构相关的内存管理代码位于/arch/$ARCH/mm目录下
14.net:网络通信相关代码,包含各种常见网络协议栈:TCP/IP,IPX,BlueTooth等。
15.samples:示例代码
16.scripts:用于内核配置的脚本文件,用于实现内核配置的图形界面。当运行make menuconfig或者make xconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。
17.security:安全性相关的代码
18.tools:Linux中的常用工具
19.sound:音频处理相关代码
20.usr:内核启动相关的代码
21.virt:内核虚拟机相关的代码
22.COPYING:许可和授权信息。Linux内核在GPLv2许可证下授权。该许可证授予任何人有权免费去使用、修改、分发和共享源代码和编译代码。然而,没有人可以出售源代码。
23.CREDITS :贡献者列表
24.Kbuild:这是一个设置一些内核设定的脚本。打个比方,这个脚本设定一个ARCH变量,这是开发者想要生成的内核支持的处理器类型。
25.Kconfig:这个脚本会在开发人员配置内核的时候用到
26.MAINTAINERS:这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。当一个开发者在内核中发现一个问题,并希望能够报告给能够处理这个问题的维护者时,这是是很有用的。
27.Makefile:这个脚本是编译内核的主要文件。这个文件将编译参数和编译所需的文件和必要的信息传给编译器。
28.README:这个文档提供给开发者想要知道的如何编译内核的信息。
29.REPORTING-BUGS :这个文档提供如何报告问题的信息。