提示:本系列文章重点学习Linux内核
Linux内核--源代码的目录结构
简介
提示:在这里先对源代码的目录结构做一个概述,以便大家能更好的理解:
通常可以将Linux内核源代码分为三个主要部分,即内核核心代码、其他非核心代码和辅助性文件。
提示:以下是本篇文章将重点阐述Linux内核的源代码的目录结构
一、三个主要部分
下面对这三个部分进行更详细的说明:
(1) 内核核心代码:
内核核心代码,包括各个子系统和子模块,以及其它的支撑子系统,例如电源管理、Linux初始化等。
*arch:* 特定体系结构的代码,如x86、ARM、PowerPC等。与体系结构相关 的代码。对应于每个支持的体系结构,有一个相应的子目录如x86、 arm等与之对应,相应目录下有对应的芯片与之对应
*lib:* 与体系结构无关的内核库代码,与系统调用相关与体系结构相关的内 核库代码在arch/arm/lib下
block: 块设备子系统的代码,用于处理块设备(硬盘、SSD等)。
*crypto*: 加密算法和模块的实现。常用加密及散列算法,和一些压缩及CRC校验算法。
*fs:* 文件系统实现的代码,包括ext4、Btrfs、FAT等。文件系统代码,每个 支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等
*include:* 头文件,定义了内核中使用的数据结构、宏等。
Ø 这里包括编译内核所需的大部分头文件
Ø 与平台无关的头文件放在include/linux子目录下
Ø 各类驱动或功能部件的头文件(/media、 /mtd、 /net等 )
Ø 与体系相关的头文件 arch/arm/include/
Ø 与平台相关的头文件路径arch/arm/mach-s5p6818/include/mach
*init:* 初始化代码,包括启动过程和初始化子系统的代码。内核初始化代码, 其中的main.c中的start_ _kernel函数是系统引导起来后运行的第1个 函数,这是研究内核工作过程的起点
*ipc:* 进程间通信机制的实现,如消息队列、信号量等。
*kernel*: 内核核心代码,包含调度程序、定时器、进程管理等。内核管理的核心 代码,此目录下的文件实现了大多数linux系统的内核函数,体系结构 相关的代码在arch/arm/kernel
*mm:* 内存管理子系统。与体系结构无关的内存管理代码与处理器体系结构 相关的代码在arch/arm/mm下
(2) 其他非核心代码:
其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等。
*drivers:* 各种硬件设备的驱动程序,如网络接口、图形卡、声卡等。设备驱动 代码,占整个内核代码量的一半以上,里面的每个子目录对应一类驱动 程序,如:
block:块设备、char:字符设备、net:网络设备等
sound: 声音子系统的实现。
usb: USB设备的支持。
*net:* 网络协议栈的实现,如TCP/IP、UDP等。
(3) 辅助性文件:
编译脚本、配置文件、帮助文档、版权说明等辅助性文件
*Documentation:* 包含内核的文档和说明。
*scripts:* 包含编译脚本、配置脚本等用于构建内核的脚本。
LICENSES: 许可证文件,指定内核代码的开源许可证。
Makefile: 用于构建内核的Makefile。
Kconfig: 配置文件,用于配置内核编译选项。
MAINTAINERS: 维护者文件,列出内核的不同部分的维护者。
CREDITS: 贡献者名单,列出对内核做出贡献的人员。
这样的划分更直观地反映了Linux内核源代码的结构,使不同类型的文件和目录更容易被理解和管理。
二、 顶层目录结构
使用ls命令看到的内核源代码的顶层目录结构,具体描述如下:
include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。
kernel/ ---- Linux内核的核心代码,包含了进程调度子系统,以及和进程调度相关的模块。
mm/ ---- 内存管理子系统。
fs/ ---- VFS子系统。
net/ ---- 不包括网络设备驱动的网络子系统。
ipc/ ---- IPC(进程间通信)子系统。
arch// ---- 体系结构相关的代码,例如arm, x86等等。
arch//mach- ---- 具体的machine/board相关的代码。
arch//include/asm ---- 体系结构相关的头文件。
arch//boot/dts ---- 设备树(Device Tree)文件。
init/ ---- Linux系统启动初始化相关的代码。
block/ ---- 提供块设备的层次。
sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。
drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。
lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相关的库函数。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虚拟机技术(KVM等)的支持。
usr/ ---- 用于生成initramfs的代码。
firmware/ ---- 保存用于驱动第三方设备的固件。
samples/ ---- 一些示例代码。
tools/ ---- 一些常用工具,如性能剖析、自测试等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。
COPYING ---- 版权声明。
MAINTAINERS ----维护者名单。
CREDITS ---- Linux主要的贡献者名单。
REPORTING-BUGS ---- Bug上报的指南。
Documentation, README ---- 帮助、说明文档。
三、 代码占比
- 第一的是内核的 drivers 部分,这个是针对不同硬件的驱动,达到 66% , 达到了721344K(大约704MB)。
- 第二的是内核的 arch 部分,这个是针对不同体系结构的代码,比如X86, ARM,PowerPC等,达到12%, 135288K(大约132MB)
- 第三的是内核的 sound (声音系统相关),include (头文件等),fs(文件系统,如XFS,ext4/3 等),tools(比如 bpf,perf等 ) 这几个部分。 它们占用基本接近,达到4%, 在46820K左右(大约46MB)。
四、补充说明
在使用命令“ls -al”查看嵌入式Linux内核源代码文件时,信息如下:
\1. drwxrwxr-x 26 lwguo2403 lwguo2403 4096 3月 12 08:53 .
\2. drwxr-xr-x 3 lwguo2403 lwguo2403 4096 3月 11 19:58 ..
\3. drwxrwxr-x 24 lwguo2403 lwguo2403 4096 5月 11 2023 arch
\4. -rw-rw-r-- 1 lwguo2403 lwguo2403 272453 3月 12 08:52 .config
\5. ........
(1) 解释:
ls -al 命令用于显示目录中所有文件和子目录的详细信息。其中:
\1. drwxrwxr-x 26 lwguo2403 lwguo2403 4096 3月 12 08:53 .
drwxrwxr-x: 表示这是一个目录(d),且拥有者(user)、组用户(group)和其他用户(others)有读(r)写(w)和执行(x)的权限。
26: 表示目录中的子项数(包括 . 和 …)。
lwguo2403: 表示拥有者的用户名。
lwguo2403: 表示所属用户组的组名。
4096: 表示目录的大小(以字节为单位)。
3月 12 08:53: 表示文件或目录的最后修改时间。
\1. -rw-rw-r-- 1 lwguo2403 lwguo2403 272453 3月 12 08:52 .config
-rw-rw-r–: 表示这是一个普通文件,拥有者和组用户有读和写的权限,其他用户只有读的权限。
1: 表示链接数,即有多少个目录项链接到这个文件。
lwguo2403: 表示拥有者的用户名。
lwguo2403: 表示所属用户组的组名。
272453: 表示文件大小(以字节为单位)。
3月 12 08:52: 表示文件的最后修改时间。
.config: 文件的名称。
(2) 文件或目录的权限信息
文件或目录的权限信息以10个字符的形式表示。下面是这些权限字符的含义:
-
第一个字符:文件类型
d :目录
- :普通文件
l :符号链接(软链接) -
后九个字符(三组):权限
每组包含三个字符,分别表示文件拥有者(user)、所属用户组(group)、其他用户(others)的权限。
权限字符说明:
r :读权限(Read)
w :写权限(Write)
x :执行权限(eXecute)
每组权限的位置:
第一组:文件拥有者的权限
第二组:所属用户组的权限
第三组:其他用户的权限
-
以上提供的示例中每一组权限的解释:
drwxrwxr-x:
d: 目录
rwx: 文件拥有者有读、写、执行权限
rwx: 所属用户组有读、写、执行权限
r-x: 其他用户有读、执行权限
-rw-rw-r–:
-: 普通文件
rw-: 文件拥有者有读、写权限
rw-: 所属用户组有读、写权限
r–: 其他用户有读权限