Linux2.6.34源码目录结构
1、 arch
体系结构相关的代码,例如arm, x86等等。
arch/mach- ---- 具体的machine/board相关的代码。
arch/include/asm ---- 体系结构相关的头文件。
arch/boot/dts ---- 设备树(Device Tree)文件。
该目录中每个子目录都与某种体系结构对应,用于存放系统结构相关代码,向平台无关的系统核心模块提供所需的功能接口。每个体系结构对应的子目录下通常至少包含以下几个子目录:
* Kernel子目录:用于存放特定体系结构特有信号量的实现代码和对称多处理器(Symmetric MultiProccessing,简称SMP)相关模块。
* Lib子目录:用于存放以来依赖当前体系结构的辅助功能,如利用当前体系结构特性实现的strlen和memcpy内存操作函数;与通用的实现方法相比,他们的开销小、更加高效。
* Mm子目录:用于存放体系架构特定的内存管理模块,包括内存的初始化、页表管理等内容。
* Boot子目录:该目录中包含了当前平台上系统引导过程使用的部分或全部代码。这部分代码以来当前平台,用于完成向系统内存装载内核镜像的工作。
2、block
块设备驱动程序I/O 调度。
3、crypto
内核本身所用的加密API,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。
4、Documentation
这个目录下面没有内核代码,只有很多质量参差不齐的文档,但往往能够给我们提供很多的帮助。
5、drivers
这个目录是内核中最庞大的一个目录,显卡、网卡、SCSI适配器、PCI总线、USB总线和其他任何Linux支持的外围设备或总线的驱动程序都可以在这里找到。
driver通过driver_register()注册到总线(bus_type)上,代表系统具备了驱动某种设备(device)的能力。当某个device被注册到同样的总线的时候(通常是总线枚举的时候发现了这个设备),总线驱动会对driver和device会通过一定的策略进行binding(即进行匹配),如果Binding成功,总线驱动会调用driver的probe()函数,把设备的信息(例如端口,中断号等)传递给驱动,驱动就可以对真实的物理部件进行初始化,并把对该设备的控制接口注册到Linux的其他子系统上(例如字符设备,v4l2子系统等)。这样操作系统的其他部分就可以通过这些通用的接口来访问设备了。
6、firmware
firmware保存用于驱动第三方设备的固件,通常由驱动去加载。
firmware表示运行在非“控制处理器”(指不直接运行操作系统的处理器,例如外设中的处理器,或者被用于bare metal的主处理器的其中一些核)中的程序。这些程序很多时候使用和操作系统所运行的处理器完全不同的指令集。这些程序以二进制形式存在于Linux内核的源代码树中,生成目标系统的时候,通常拷贝在/lib/firmware目录下。当driver对device进行初始化的时候,通过request_firmware()等接口,在一个用户态helper程序的帮助下,可以把指定的firmware加载到内存中,由驱动传输到指定的设备上。
7、fs
虚拟文件系统(VFS,Virtual File System)的代码,和各个不同文件系统的代码都在这个目录中。Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。比如ext2文件系统对应的是fs/ext2目录。
一个文件系统是存储设备和需要访问存储设备的进程之间的媒介。存储设备可能是本地的物理上可访问的,比如硬盘或CD-ROM驱动器,它们分别使用ext2/ext3和isofs文件系统;也可能是通过网络访问的,使用NFS文件系统。
还有一些虚拟文件系统,比如proc,它以一个标准文件系统出现,然而,它其中的文件只存在于内存中,并不占用磁盘空间。
8、include
这个目录包含了内核中大部分的头文件,它们按照下面的子目录进行分组。
include/asm-*/,这样的子目录有多个,每一个都对应着一个arch的子目录,比如include/asm-alpha、include/asm-arm、include/asm-i386等。每个子目录中的文件都定义了支持给定体系结构所必须的预处理器宏和内联函数,这些内联函数多数都是全部或部分使用汇编语言实现的。
编译内核时,系统会建立一个从include/asm目录到目标体系结构特有的目录的符号链接。比如对于arm平台,就是include/asm-arm到include/asm的符号链接。因此,体系结构无关部分的内核代码可以使用如下形式包含体系相关部分的头文件。
#include <asm/some-file>
include/linux/,与平台无关的头文件都在这个目录下面,它通常会被链接到目录/usr/include/linux(或者它里面的所有文件会被复制到/usr/include/linux目录下面)。因此用户应用程序里和内核代码里的语句:
#include <linux/some-file>
9、init
内核的初始化代码。包括main.c、创建早期用户空间的代码以及其他初始化代码。
10、ipc
进程间通信(interprocess communication)。它包含了共享内存、信号量以及其他形式IPC的代码。
11、kernel
内核中最核心的部分,包括进程的调度(kernel/sched.c),以及进程的创建和撤销(kernel/fork.c和kernel/exit.c)等,和平台相关的另外一部分核心的代码在arch/*/kernel目录。
12、lib
库代码,实现了一个标准C库的通用子集,包括字符串和内存操作的函数(strlen、mmcpy和其他类似的函数)以及有关sprintf和atoi的系列函数。与arch/lib下的代码不同,这里的库代码都是使用C编写的,在内核新的移植版本中可以直接使用。
13、mm
包含了体系结构无关部分的内存管理代码,体系相关的部分位于arch/*/mm目录下。
14、net
网络相关代码,实现了各种常见的网络协议,如TCP/IP、IPX等。
15、samples
一些示例代码。
16、scripts
脚本,这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。当运行make menuconfig或者make xconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。
17、security
这个目录包括了不同的Linux安全模型的代码,比如NSA Security-Enhanced Linux。对计算机免于受到病毒和黑客的侵害很重要.
18、sound
声卡驱动以及其他声音相关的代码,跟音频处理相关。
19、tools
一些常用工具,如性能剖析、自测试等。
20、usr
实现了用于打包和压缩的的cpio等。。这个文件夹中的代码在内核编译完成后创建这些文件。
21、virt
此文件夹包含了虚拟化代码,它允许用户一次运行多个操作系统。通过虚拟化,客户机操作系统就像任何其他运行在Linux主机的应用程序一样运行。提供虚拟机技术(KVM等)的支持
22、COPYING
许可和授权信息。Linux内核在GPLv2许可证下授权。该许可证授予任何人有权免费
去使用、修改、分发和共享源代码和编译代码。然而,没有人可以出售源代码。
23、CREDITS
贡献者列表。
24、Kbuild
是kernel build的意思,就是内核编译的意思,设置一些内核设定的脚本。打个比方,
这个脚本设定一个ARCH变量,这是开发者想要生成的内核支持的处理器类型。
25、MAINTAINERS
这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。
当一个开发者在内核中发现一个问题,并希望能够报告给能够处理这个问题的维护者时,这是是很有用的。
26、Makefile
这个脚本是编译内核的主要文件。这个文件将编译参数和编译所需的文件和必要的信息传给编译器。
27、README
这个文档提供给开发者想要知道的如何编译内核的信息。
28、REPORTING-BUGS
Bug上报指南提供如何报告问题的信息。
29、Kconfig
这个脚本会在开发人员配置内核的时候用到。
总结:
这么多目录中比较重要的是arch和drivers目录,然后其他有点相关的还有include、block、mm、net、lib等目录。根目录下的单文件比较重要的是Kbuild,Kconfig,Makefile。