内核源码目录结构

浏览内核代码之前,有必要知道内核源码的整体分布情况,按照惯例,内核代码安装在/usr/src/linux目录下,该目录下的每一个子目录都代表了一个特定的内核功能性子集,下面针对2.6.23版本进行简单描述。

(1)Documentation。

这个目录下面没有内核代码,只有很多质量参差不齐的文档,但往往能够给我们提供很多的帮助。

(2)arch。

所有与体系结构相关的代码都在这个目录以及include/asm-*/目录中,Linux支持的每种体系结构在arch目录下都有对应的子目录,而在每个体系结构特有的子目录下又至少包含3个子目录。

kernel:存放支持体系结构特有的诸如信号量处理和SMP之类特征的实现。

lib:存放体系结构特有的对诸如strlen和memcpy之类的通用函数的实现。

mm:存放体系结构特有的内存管理程序的实现。

除了这3个子目录之外,大多数体系结构在必要的情况下还有一个boot子目录,包含了在这种硬件平台上启动内核所使用的部分或全部平台特有代码。

此外,大部分体系结构所特有的子目录还根据需要包含了供附加特性使用的其他子目录。比如,i386目录包含一个math-emu子目录,其中包括了在缺少数学协处理器(FPU)的CPU上运行模拟FPU的代码。

(3)drivers。

这个目录是内核中最庞大的一个目录,显卡、网卡、SCSI适配器、PCI总线、USB总线和其他任何Linux支持的外围设备或总线的驱动程序都可以在这里找到。

(4)fs。

虚拟文件系统(VFS,Virtual File System)的代码,和各个不同文件系统的代码都在这个目录中。Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。比如ext2文件系统对应的是fs/ext2目录。

一个文件系统是存储设备和需要访问存储设备的进程之间的媒介。存储设备可能是本地的物理上可访问的,比如硬盘或CD-ROM驱动器,它们分别使用ext2/ext3和isofs文件系统;也可能是通过网络访问的,使用NFS文件系统。

还有一些虚拟文件系统,比如proc,它以一个标准文件系统出现,然而,它其中的文件只存在于内存中,并不占用磁盘空间。

(5)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>
包含的头文件的内容是一致的。

include目录下的其他子目录,在此不做赘述。

(6)init。

内核的初始化代码。包括main.c、创建早期用户空间的代码以及其他初始化代码。

(7)ipc。

IPC,即进程间通信(interprocess communication)。它包含了共享内存、信号量以及其他形式IPC的代码。

(8)kernel。

内核中最核心的部分,包括进程的调度(kernel/sched.c),以及进程的创建和撤销(kernel/fork.c和kernel/exit.c)等,和平台相关的另外一部分核心的代码在arch/*/kernel目录。

(9)lib。

库代码,实现了一个标准C库的通用子集,包括字符串和内存操作的函数(strlen、mmcpy和其他类似的函数)以及有关sprintf和atoi的系列函数。与arch/lib下的代码不同,这里的库代码都是使用C编写的,在内核新的移植版本中可以直接使用。

(10)mm。

包含了体系结构无关部分的内存管理代码,体系相关的部分位于arch/*/mm目录下。

(11)net。

网络相关代码,实现了各种常见的网络协议,如TCP/IP、IPX等。

(12)scripts。

该目录下没有内核代码,只包含了用来配置内核的脚本文件。当运行make menuconfig或者make xconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。

(13)block。

block层的实现。最初block层的代码一部分位于drivers目录,一部分位于fs目录,从2.6.15开始,block层的核心代码被提取出来放在了顶层的block目录。

(14)crypto。

内核本身所用的加密API,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。

(15)security。

这个目录包括了不同的Linux安全模型的代码,比如NSA Security-Enhanced Linux。

(16)sound。

声卡驱动以及其他声音相关的代码。

(17)usr。

实现了用于打包和压缩的的cpio等。
### Linux 内核源码目录结构解释 #### 1. 主要顶层目录概述 Linux 内核源码的根目录下包含了多个子目录,每个子目录都有特定的功能和用途。以下是主要的顶级目录及其功能说明: - **arch/**: 存放架构相关的代[^4]。这里包含不同硬件平台(如 x86, arm 等)的具体实现。 - **block/**: 包含块设备驱动程序以及通用块层的核心逻辑。 - **crypto/**: 实现各种加密算法和服务函数。 - **drivers/**: 驱动程序的主要存放位置,按类别进一步细分到各个子目录中,比如 `char`, `net` 和 `usb` 等。 - **fs/**: 文件系统的具体实现在此目录下完成,支持多种不同的文件系统类型,例如 ext4、ntfs 等。 - **include/**: 头文件集合,提供给整个项目使用的公共头文件定义。 - **init/**: 启动过程中执行的关键初始化操作位于该路径下的 C 文件里。 - **ipc/**: 进程间通信机制的相关组件在此处开发维护。 - **kernel/**: 核心调度器和其他基础服务模块都放置于此。 - **lib/**: 库函数库,用于辅助其他部分的工作。 - **mm/**: 虚拟内存管理和物理页面分配等功能都在这个目录处理。 - **net/**: 网络协议栈及相关网络接口管理。 - **samples/**: 提供一些简单的例子来帮助开发者理解如何编写内核模块或其他特性。 - **scripts/**: 构建工具链脚本及其他自动化构建相关资源。 - **sound/**: 声音子系统有关的内容。 - **tools/**: 用户空间调试和支持工具集。 - **usr/**: 支持早期用户空间启动过程中的某些需求。 - **virt/**: 虚拟化技术的支持代。 这些只是其中的一部分重要组成部分;实际上还有更多专门化的子目录服务于更具体的领域或目的。 对于想要深入了解某个特定方面的人来说,建议先阅读官方文档并关注感兴趣的区域内的 README 或 Kconfig 文件获取更多信息。 ```bash tree -L 1 /path/to/linux/kernel/source/ ``` 上述命令可以帮助直观展示指定路径下的最上层目录布局情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值