Linux kernel目录、配置文件介绍
1. linux代码目录结构:
kernel/ -------内核核心代码,进程调度相关模块
mm/------------内存管理子系统
fs/------------文件子系统
net/-----------不包含网络驱动的网络子系统
ipc/-----------进程间通信子系统
arch/----------体系架构相关代码
arch/mach------具体machine/board相关代码
arch/include/asm/—体系结构相关文件
arch/boot/dts–设备树相关文件
init/----------linux初始化相关文件
block/---------块设备相关
sound/---------音频子系统
drivers/-------设备驱动
lib/-----------内核中需要使用的库函数
crypto/--------加密、解密相关的库函数
security/------安全相关selinux
virt/----------提供虚拟机技术的支持(KVM等)
usr/-----------用于生成initramfs的代码
firmware/------用于驱动的第三方设备固件
samples/-------一些示例代码
tools/---------一些常用工具
Kconfig----
Kbuild-----
Makefile----
2. Kconfig defconfig Kbuild Makefile .config介绍
Kconfig提供菜单选项 —》 defconfig 默认配置模板—》XX_prune.config厂商剪裁配置—》 用户配置.config —》 Makefile/Kbuild根据.config执行编译
Kconfig(定义配置菜单):
- 位于内核源码各个子目录下(drivers/net/Kconfig),用于各种配置的源文件
- 执行make menuconfig 系统读取Kconfig文件,生成配置界面供开发进行配置(make menuconfig)
- 最后生成.config文件
下面是一段Kconfig中的一个config配置项CONFIG_MODVERSIONS的配置:
config MODVERSIONS bool "Set version information on all module symbols" depends on MODULES help Usually, modules have to be recompiled whenever you switch to a new kernel. ...关键字说明:
- config:表示一个配置项,配置项为CONFIG_xxx(CONFIG_MODVERSIONS)
- bool:类型定义
- depends on:依赖关系,依赖XXX,只有XXX选项被选中时,才能设置当前选项
- help:后面文字为配置界面的帮助信息
defconfig(默认配置模板)
Kconfig中定义的配置项可以提供make menuconfig进行选择=y =m =n(y:编译进内核镜像,m:编译成模块,n:不编译)来决定是否开启或者关闭。同时也可以通过defconfig文件进行打开。
- 文件位置:通常位于 arch/<架构>/configs/ 目录下(例如 arch/arm64/configs/defconfig 或 arch/x86/configs/x86_64_defconfig)
- 文件内容:仅包含修改过的配置项
- 文件用途:作为生成.config的种子
- 工作流程:从defconfig—》.config
当你执行命令 make _defconfig 时,Kbuild 系统会做以下事情:
读取 arch/<架构>/configs/_defconfig。
将其中的配置项展开,并合并内核默认的通用配置。
生成根目录下的 .config 文件。
XX_prune.config:厂商裁剪配置
- 文件位置:通常位于板级支持包(BSP)或特定厂商的目录中(如 TI 的 Processor SDK)。
- 文件作用:这是一个增量配置或裁剪配置文件。
XX_prune.config会将.config中的一些功能进行剪裁掉
“prune” (裁剪) 的含义:这个文件通常用于关闭(Disable)某些在通用 defconfig 中开启、但在特定硬件上不需要或不兼容的功能,以减小内核体积。 - 使用方式:在 TI 的构建系统中,通常会先加载通用的 defconfig,然后应用这个XX_prune.config 来覆盖(关闭)特定选项。
.config(最终配置文件)
- 文件位置:源码根目录 (linux-kernel/),
- 文件内容:包含所有配置项(无论是否修改)
- 文件用途:用于提供给Makefile进行编译
- 内容解释:
CONFIG_NETWORKING=y (表示将网络支持直接编译进内核)
CONFIG_EXT4_FS=m (表示将 ext4 文件系统编译成可加载模块)
CONFIG_DEBUG=n
#CONFIG_DEBUG is not set (表示关闭调试选项)
y:编译进内核镜像(built-in)。
m:编译成模块(module)。
n:不编译。
Makefile 与 Kbuild(编译规则的执行者):
内核顶层和各子目录下的 Makefile(以及专门用于内核构建的 Kbuild 文件)会读取 .config 中的配置项,动态决定哪些代码需要被编译,以及以何种方式编译(是打包进内核 vmlinux,还是生成独立的 .ko 模块)。
- 顶层makefile:负责整体框架的初始化;
- 各个子目录的makefile:负责该目录下的编译规则
obj-y += foo.o:表示将 foo.c 编译并链接进内核主镜像。
obj-m += bar.o:表示将 bar.c 编译成独立的内核模块 bar.ko。
obj-$(CONFIG_XXX) += baz.o:这是最关键的一点,它实现了配置驱动编译。如果 .config 中 CONFIG_XXX=y,则编译进内核;如果 CONFIG_XXX=m,则编译成模块;如果没有设置,则跳过编译。
| 文件 | 角色 | 类比 |
|---|---|---|
| defconfig | 基础模板 | 汽车的“标准出厂配置单”(只有轮子和发动机)。 |
| ti_arm64_prune.config | 定制/裁剪单 | 4S店的“选装包”(去掉天窗,换个轮毂)。 |
| .config | 最终施工图纸 | 最终确定的“购车合同”,工厂(Makefile)完全照此生产。 |
在 TI SDK 或类似的嵌入式编译环境中,流程通常是这样的:
1.初始加载:系统读取 defconfig(默认全量配置)。
2.裁剪:系统读取 arm64_prune.config,关闭不需要的选项。
3.生成:合并上述两者,生成最终的 .config 文件。
4.编译:Kbuild/Makefile 读取 .config,开始根据配置编译代码。
3.kernel下面的目录及作用
核心基础与进程管理
sched/ (Scheduler)
功能:进程调度器。这是内核中最复杂的子系统之一。
内容:包含了完全公平调度器(CFS)的实现、实时调度策略、调度类的定义等。它决定了哪个进程在什么时候获得 CPU 时间片。
rcu/ (Read-Copy Update)
功能:RCU 同步机制。
内容:实现了一种高效的读写锁机制,允许读操作和写操作并发执行,广泛用于内核中读多写少的场景(如路由表、文件系统目录项等)。
cgroup/ (Control Groups)
功能:控制组。
内容:用于对一组进程进行资源限制(CPU、内存、IO等)、统计和隔离。这是 Docker、Kubernetes 等容器技术实现资源隔离的底层基石。
module/
功能:内核模块支持。
内容:实现了内核模块的加载(insmod)、卸载(rmmod)以及符号版本管理等核心逻辑。
📡 中断与并发控制
irq/ (Interrupt Request)
功能:中断核心处理。
内容:管理中断描述符、中断流控制、中断线程化等。注意:具体的硬件中断控制器驱动通常在 drivers/irqchip/ 或 arch/ 下。
locking/
功能:锁机制与并发原语。
内容:包含了信号量(semaphore)、互斥体(mutex)、读写锁(rwlock)以及并发调试工具(如 lockdep)的实现。
futex/ (Fast Userspace Mutex)
功能:快速用户空间互斥锁。
内容:实现了 futex 系统调用。这是用户态线程库(如 pthread)实现高效锁的基础,只有在发生竞争时才会陷入内核态。
events/
功能:事件接口。
内容:通常指 eventfd 等相关的实现,用于用户空间和内核空间,或进程间的事件通知机制。
🔍 调试、追踪与监控
trace/
功能:内核追踪子系统 (Ftrace)。
内容:这是内核强大的调试工具集,用于追踪函数调用、中断延迟、调度延迟等。
bpf/ (Berkeley Packet Filter)
功能:eBPF 虚拟机与核心。
内容:现代 Linux 内核中最热门的功能之一。允许用户在内核中安全地运行沙盒程序,用于高性能网络、监控、安全策略等。
debug/
功能:通用调试代码。
内容:包含一些用于调试内核的辅助代码,例如 KGDB(内核调试器)的核心部分。
gcov/
功能:代码覆盖率分析。
内容:用于收集内核代码的执行覆盖率数据,帮助开发者测试内核代码的测试完整性。
kcsan/ (Kernel Concurrency Sanitizer)
功能:并发错误检测器。
内容:一种动态分析工具,用于检测内核中的数据竞争(Data Race)问题。
livepatch/
功能:内核热补丁。
内容:允许在不重启系统的情况下,动态修复正在运行的内核中的安全漏洞或 Bug。
⚡ 电源与硬件辅助
power/
功能:电源管理核心。
内容:实现了系统挂起(Suspend)、休眠(Hibernate)以及运行时的电源管理框架(Runtime PM)。
dma/
功能:DMA(直接内存访问)核心框架。
内容:管理 DMA 引擎,帮助设备在不占用 CPU 的情况下进行数据传输。
📝 其他
time/
功能:时间子系统。
内容:管理内核的时间保持、定时器、时钟源(Clocksource)和时钟事件设备(Clockevent)。
printk/
功能:内核日志打印系统。
内容:实现了 printk 函数,负责将内核消息格式化并写入到内核日志缓冲区(供 dmesg 读取)。
entry/
功能:系统调用入口。
内容:处理系统调用的通用逻辑,连接架构相关的汇编入口和 C 语言实现的内核服务。
configs/
功能:内核配置片段。
内容:通常包含一些预定义的配置选项,用于启用特定的调试功能或发行版配置。
