2. Linux 内核源码获取与结构概览:从 kernel.org 获取源码,理解内核源码树的主要目录结构
在开始内核裁剪与调试之前,获取一份完整、纯净的官方内核源码是第一步。本章将指导你从 kernel.org 获取主线内核源码,并深入剖析内核源码树(Linux Kernel Source Tree)的核心目录结构。理解这些目录的职责与依赖关系,是后续进行配置裁剪、模块开发和调试追踪的基础。
2.1 从 kernel.org 获取源码
Linux 内核的官方发布渠道是 The Linux Kernel Archives(https://www.kernel.org)。该站点提供主线(Mainline)、稳定(Stable)、长期支持(LTS)等多个分支的源码压缩包(tarball)以及 Git 仓库。
2.1.1 选择内核版本
根据课程目标(裁剪与调试),建议选择 长期支持(LTS) 版本或 最新的稳定版本。LTS 版本维护周期长,社区支持稳定,适合嵌入式产品开发。
| 分支类型 | 特点 | 适用场景 |
|---|---|---|
| 主线(Mainline) | 最新特性,开发活跃,约 2-3 个月发布一次 | 尝鲜、新硬件支持验证 |
| 稳定(Stable) | 基于主线,修复关键 Bug,通常为 x.y.z 格式 |
一般生产环境、桌面系统 |
| 长期支持(LTS) | 维护周期长达 2-6 年,只接受安全与重大 Bug 修复 | 嵌入式系统、工业控制、车载设备 |
2.1.2 下载与验证
推荐使用 wget 或 curl 下载,并通过 gpg 验证签名以确保源码完整性。
# 1. 下载内核源码压缩包(以 6.1 LTS 为例)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.xz
# 2. 下载对应的签名文件
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.sign
# 3. 导入内核维护者的公钥(首次需要)
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
# 4. 验证签名
xz -cd linux-6.1.76.tar.xz | gpg --verify linux-6.1.76.tar.sign -
# 5. 解压源码
tar -xf linux-6.1.76.tar.xz
cd linux-6.1.76
git clone 克隆 Linus Torvalds 的仓库(git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git),以便后续方便地切换分支和打补丁。
2.2 内核源码树主要目录结构概览
解压后的内核源码根目录包含数十个一级子目录。这些目录按照功能领域进行组织,形成了清晰的模块化架构。理解每个目录的核心职责,是进行内核裁剪和调试定位的前提。
2.3 核心目录深度解析
以下对内核源码树中最重要的几个目录进行详细说明,这些目录是后续裁剪和调试工作的主要操作对象。
2.3.1 arch/:体系结构相关代码
该目录包含内核针对不同 CPU 架构的底层代码。每个子目录对应一种架构,如 x86、arm、arm64、riscv。裁剪内核时,通常只需要保留目标平台的架构目录。
- boot/:启动引导代码(如
head.S、vmlinux.lds) - kernel/:架构特定的核心代码(如中断控制器、时钟管理)
- mm/:架构特定的内存管理(如 TLB、页表操作)
- configs/:该架构的默认配置文件(如
defconfig)
2.3.2 kernel/:核心内核子系统
这是内核最核心的部分,包含进程调度、信号处理、系统调用、工作队列等基础机制。在调试时,kernel/sched/ 和 kernel/irq/ 是 ftrace 追踪的热点区域。
2.3.3 drivers/:设备驱动
这是源码树中体积最大的目录,通常占整个内核代码量的 50% 以上。它按设备类型划分子目录:gpio/、i2c/、spi/、net/、usb/、mmc/ 等。裁剪内核的主要工作就是在此目录中禁用不需要的驱动。
make menuconfig 中,将 Device Drivers 下与目标硬件无关的驱动全部取消编译(设置为 n),可以显著减小内核体积并提升安全性。
2.3.4 fs/:文件系统
包含内核支持的所有文件系统实现,如 ext4/、btrfs/、proc/、sysfs/、debugfs/、tmpfs/ 等。其中 debugfs/ 和 tracefs/ 是 ftrace 和 kgdb 调试信息输出的关键文件系统。
2.3.5 include/:内核头文件
包含内核内部使用的所有头文件(.h)。其中 include/linux/ 是核心头文件目录,定义了内核 API、数据结构(如 struct list_head、struct task_struct)和宏。在编写内核模块或使用 kgdb 调试时,经常需要查阅此目录下的定义。
2.4 构建系统相关文件
内核的构建系统基于 Kbuild,它由顶层 Makefile、Kconfig 以及各目录下的 Makefile 和 Kconfig 文件组成。
| 文件/目录 | 作用 | 裁剪/调试中的意义 |
|---|---|---|
| Makefile | 顶层构建入口,定义编译规则、目标、链接脚本 | 修改 EXTRAVERSION 可自定义内核版本号 |
| Kconfig | 内核配置菜单的根定义文件 | 通过 source 语句引入各子系统的配置选项 |
| scripts/ | 包含配置、编译、模块管理等辅助脚本 | scripts/kconfig/ 提供 menuconfig 等前端工具 |
| .config | 编译时生成的配置文件,记录所有选项的开关状态 | 裁剪的直接产物,调试时需确认 CONFIG_KGDB 等选项 |
2.5 调试与追踪相关目录
在进行 kgdb 和 ftrace 调试时,以下目录和文件是重点关注对象:
- kernel/trace/:ftrace 框架的核心实现,包含
trace.c、trace_output.c以及各种追踪器(如trace_sched_wakeup.c)。 - kernel/debug/:kgdb 调试桩的核心代码,包含
gdbstub.c、debug_core.c。 - arch/x86/kernel/kgdb.c(或对应架构):架构相关的 kgdb 实现,如断点处理、单步执行。
- fs/debugfs/:debugfs 文件系统,用于在运行时导出调试信息。
- fs/tracefs/:tracefs 文件系统,ftrace 的控制接口挂载点(通常挂载在
/sys/kernel/tracing)。
CONFIG_DEBUG_KERNEL、CONFIG_KGDB、CONFIG_FTRACE 以及 CONFIG_DEBUG_FS 等调试选项被启用。这些选项通常位于 Kernel hacking 菜单下,默认可能被关闭。
2.6 本章小结
通过本章的学习,你应当能够独立完成以下操作:
- 从 kernel.org 下载并验证指定版本的内核源码。
- 识别内核源码树中
arch/、kernel/、drivers/、fs/等核心目录的职责。 - 定位与 kgdb 和 ftrace 调试相关的源码目录和配置文件。
- 理解
Kconfig和Makefile在裁剪过程中的作用。