Linux内核源码目录结构解析
Linux源码的获取可通过github或者在 http://www.kernel.org 上获取最新的稳定版本源码包。
Linux内核源码拿到手后第一件事相信很多人都想知道各个目录都存放了什么样的代码,为什么要这样规划代码目录。同样的,在阅读源码之前也应知道源码的整体分布情况。
现代操作系统一般由进程管理、内存管理、文件系统、驱动和网络等组成,Linux内核源码的各个目录大致与此相对应,其目录组成如下:
arch
包括了所有和体系结构相关的核心代码。里面的每一个目录都代表一种Linux支持的内核架构,例如arm就是arm架构相关的代码,arm目录向下包括很多处理器平台,也包括了启动代码boot、架构相关配置文件configs、内核相关文件kernel、内存管理mm和库lib等。
block
提供块设备操作的一些基本接口。
certs
认证相关。
crypto
常用加密和散列算法(如AES,SHA等),还有一些压缩和CRC校验算法。
Documentation
目录下基本都是txt文档,对每个目录和模块的详细说明。
drivers
目录都是系统的设备驱动程序。
accessibility – 可访问设备,目前里面包括盲人设备
acpi – 高级配置和电源管理接口
amba – ARM研发的AMBA片上总线相关
android – Android平台支持的设备
ata – 硬盘接口技术Advanced Technology Attachment相关驱动
atm – 异步传输模式设备驱动
auxdisplay – 辅助显示设备驱动
base
bcma – Broadcom基于amba总线驱动上开发的
block – 块设备驱动
bluetooth – 蓝牙设备驱动
bus –
cdrom – CDROM设备驱动
char – 字符设备驱动
clk – 时钟驱动框架,与平台相关
clocksource – 时钟源设备驱动
connector – 内核空间和用户空间通信的新机制连接器
cpufreq – cpu动态变频
cpuidle –
crypto – 加解密设备驱动
dax – 直接访问,后面的X只是为了看起来酷,对于新兴的NVDIMM设备,可直接访问此设备上的文件系统
dca – 直接缓存访问??
devfreq – 设备相关的频率调节
dio – dio设备驱动
dma – dma设备驱动
dma-buf – 提供DMA缓存的设备驱动
edac – 错误检测和纠正设备驱动
eisa –
extcon – 外部连接器
firewire – IEEE1394 firewire设备驱动
firmware –
fmc – FMC连接器总线驱动
fpga – FPGA框架驱动
gpio – GPIO驱动,与处理器相关
gpu – 包括DRM图形渲染架构,访问图形界面的DMA引擎,IMX的IPU图像处理单元等
hid – 人机交互设备驱动
hsi – 高速同步串口接口
hv – 微软的虚拟化技术驱动
hwmon – 硬件监控芯片驱动,监控类传感器的芯片驱动
hwspinlock – 硬件自旋锁框架接口
hwtracing – 硬件跟踪调试驱动
i2c – i2c子系统总线驱动
ide – 管理ATA/IDE和ATAPI单元,主要还是硬盘驱动IDE和CD-ROM驱动ATAPI
idle – Intel处理器的idle处理驱动
iio – 工业I/O子系统,包括各种使用不同物理接口(i2c, spi, etc)传感器的驱动
infiniband – 支持多并发链接的”转换线缆”技术的硬件设备驱动
input – input设备子系统,包括各种输入设备的驱动,键盘、混合设备、鼠标、触摸屏、游戏接口、游戏操作杆、触控rmi4、触摸面板、串口IO输入设备
firmware
硬件厂商提供的内核固件,由内核驱动调用。
fs
存放Linux系统支持的文件系统代码。每个子目录对应一个文件系统,例如ext4文件系统对应就是ext4子目录。
include
目录包括编译核心所需要的大部分头文件,例如与平台相关的头文件在/include/linux子目录下,与模块相关的,例如与acpi相关的存放在/include/acpi。
init
目录包含核心初始化代码(不是系统的引导代码),这里是研究核心如何工作的好起点。
ipc
包含核心进程间的通信代码。
kernel
内核管理的核心代码。实现了大多数Linux系统的内核函数,其中最重要的为sched子目录下的代码。与处理器相关的代码都放在/arch/*/kernel目录下。
lib
包括核心的库代码。与处理器相关的库代码都放在/arch/*/lib目录下。
mm
包含独立于cpu体系结构的内存管理代码,如页式存储管理内存的分配和释放等。与具体硬件体系结构相关的内存管理代码存放在/arch/*/mm目录下。
net
包含网络部分代码,实现了各种常见的网络协议,每个子目录对应于网络的一个方面。
samples
针对各个模块的实例代码。
scripts
用于配置核心的脚本文件。
security
支持安全操作系统相关代码。包括SELinux、Apparmor、Smack和TOMOYO Linux安全模块。
sound
ALSA,OSS音频设备的驱动核心代码和常用设备驱动。
tools
内核使用的相关工具代码。
usr
实现了用于打包和压缩的cpio等。
virt
内核虚拟化相关的代码。
COPYING CREDITS Kbuild Kconfig MAINTAINERS Makefile README
1./arch文件夹下包含体系结构的相关代码,对于每个架构的cpu都有一个对应的子目录。
2./block块设备的通用函数(块设备是I/O设备的一类)。
3.COPYING是一个说明内核版权的文本文档。
4.CREDITS是对linux项目的贡献者名单列表。
5./crypto包含常用加密算法和一些压缩和CRC校验算法。
6./Documentation各类说明文档。初期其中最值得注意的有两个文档,一个是00-INDEX这相当与整个文件夹里所有文档的索引目录。另一个是文件夹zh_CN,这里面的文档都是中文。
7./drivers设备驱动文件
8.edm1_cf_imx6_fairy_defconfig软连接,作用暂时不清楚(软连接就相当于windows里的快捷方式)。
9.edm1_cf_imx6_toucan_defconfig 软连接。
10./firmware固件,老版本的内核源码好像不包含这一部分。里面含有大量的16进制文件。
11./fs里包含linux支持的文件系统代码。文件系统可以理解为管理文件的机制。
12./include内核头文件
13./init内核初始化代码,其中main.c文件中的start_kernel函数是内核引导后运行的第一个函数。
14./ipc进程间通信的相关代码。
15.Kbuild内核编译所需文件。
16.Kconfig内核变异所需文件。(下一篇记录如何编译linux源码)。
17.kernel内核管理的核心代码。
18.lib库函数代码。内核不能使用c语言标准库的代码。而是有自己的库函数替代。比如打印使用printk。
19./.mailmap邮箱列表
20.MAINTAINERS有关于内核维护以及如何提交修改建议的说明文档
21.Makefile编译内核的最顶层入口。
22./mm内存管理代码。
23./net网络支持代码。
24.REANME内核代码的总体说明。没有具体操作细节。
25.REPORTING-UBGS怎么提交bug的说明文档。
26./samples示例代码
27./scripts用于配置和编译内核的脚本文件
28./security安全,秘钥的相关文档
29./sound音频设备的驱动程序
30./tools有用工具
31./usr用来制作一个压缩的cpio归档文件
32./virt内核虚拟机
33.wandboard_defconfig软连接。猜测是指定wand所用到的默认配置文件。