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/------安全相关selinuxvirt/----------提供虚拟机技术的支持(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 ny编译进内核镜像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_NETWORKINGy 表示将网络支持直接编译进内核CONFIG_EXT4_FSm 表示将 ext4 文件系统编译成可加载模块CONFIG_DEBUGn#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_XXXy则编译进内核如果 CONFIG_XXXm则编译成模块如果没有设置则跳过编译。文件角色类比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/功能内核配置片段。内容通常包含一些预定义的配置选项用于启用特定的调试功能或发行版配置。
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/------安全相关selinuxvirt/----------提供虚拟机技术的支持(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 ny编译进内核镜像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_NETWORKINGy 表示将网络支持直接编译进内核CONFIG_EXT4_FSm 表示将 ext4 文件系统编译成可加载模块CONFIG_DEBUGn#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_XXXy则编译进内核如果 CONFIG_XXXm则编译成模块如果没有设置则跳过编译。文件角色类比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/功能内核配置片段。内容通常包含一些预定义的配置选项用于启用特定的调试功能或发行版配置。