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/

功能:内核配置片段。

内容:通常包含一些预定义的配置选项,用于启用特定的调试功能或发行版配置。

相关推荐
学困昇7 小时前
Linux 动静态库制作与原理:从 .a、.so 到 ELF 加载一次讲透
linux·运维·服务器·c语言·开发语言·c++·人工智能
ALINX技术博客7 小时前
【黑金云课堂】FPGA技术教程Linux开发:电压温度检测/USB/eMMC
linux·fpga开发
0南城逆流07 小时前
【网站分享】常用网站分享四:STM32常用外设链接
stm32·单片机·嵌入式硬件
wxmtwfx7 小时前
Googletest Mock示例
linux·mock·googletest
yu85939587 小时前
STM32 控制 W5500 以太网传输程序
stm32·单片机·嵌入式硬件
念一不念二7 小时前
【SSD】三维闪存 异步时序 同步时序
嵌入式硬件
LCG元7 小时前
STM32实战:基于STM32F103的车内防窒息系统(红外检测+GSM报警)
stm32·单片机·嵌入式硬件
ch3nyuyu7 小时前
网络编程拟面试题
linux·网络
XTIOT6667 小时前
俄罗斯诚信标签Chestny ZNAK技术约束分析与智能化应对思路
大数据·人工智能·嵌入式硬件·物联网