4、Linux内核源码获取:下载主线内核源码、解压、查看目录结构
在搭建QEMU与kgdb联调环境之前,第一步是获取一份干净、完整的主线Linux内核源码。本章将指导你完成从下载、校验到解压、浏览目录结构的全过程,为后续的内核编译与调试配置打下基础。
版本选择建议: 推荐使用长期支持(LTS)版本或最新的稳定主线版本。本课程以
v6.6.x 系列为例,该系列对QEMU和kgdb支持良好,且文档丰富。
4.1 下载主线内核源码
Linux内核官方发布站点为 kernel.org。你可以通过浏览器或命令行工具 wget / curl 下载。以下是两种主流方式:
方式一:通过HTTP/HTTPS下载(推荐)
# 下载主线稳定版内核(以 v6.6.7 为例)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.7.tar.xz
# 下载对应的签名文件用于校验
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.7.tar.sign
方式二:通过Git克隆主线仓库
如果你需要跟踪最新的开发分支或频繁切换版本,推荐使用Git方式:
# 克隆Linus Torvalds的主线仓库(完整历史,约3-4GB)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 切换到特定标签版本
cd linux
git checkout v6.6.7
注意: Git克隆会下载整个内核开发历史,体积较大且耗时较长。如果仅用于调试环境搭建,建议直接下载压缩包,更快速且节省磁盘空间。
4.2 校验与解压
为确保下载的内核源码未被篡改或损坏,建议进行完整性校验。内核社区提供了基于GPG的签名文件。
导入内核维护者公钥并校验
# 导入内核维护者公钥(以Linus Torvalds为例)
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
# 校验签名
xz -cd linux-6.6.7.tar.xz | gpg --verify linux-6.6.7.tar.sign -
# 如果输出 "Good signature",说明文件完整可信
解压源码
# 解压 tar.xz 格式的源码包
tar -xvf linux-6.6.7.tar.xz
# 解压后进入源码目录
cd linux-6.6.7
解压完成后,你会得到一个名为 linux-6.6.7 的目录,该目录即为内核源码的根目录。
磁盘空间提示: 解压后的内核源码目录大小约为1.2GB ~ 1.5GB。编译过程中还会生成大量中间文件,建议预留至少20GB的可用空间。
4.3 顶层目录结构概览
Linux内核源码的顶层目录组织清晰,每个目录都有其特定的功能归属。理解这些目录的作用,能帮助你快速定位代码。下表列出了核心目录及其功能:
| 目录/文件 | 功能描述 | 调试关注度 |
|---|---|---|
arch/ |
体系结构相关代码,如 x86、arm64、riscv 等 | 高(调试需指定架构) |
kernel/ |
核心内核代码,包括进程调度、信号、时间管理等 | 高(kgdb断点常设于此) |
drivers/ |
设备驱动代码,按子系统分类(如 net、usb、pci) | 高(驱动调试主要区域) |
mm/ |
内存管理子系统 | 中 |
fs/ |
文件系统实现,如 ext4、btrfs、procfs | 中 |
net/ |
网络协议栈 | 中 |
include/ |
全局头文件,定义内核API和数据结构 | 高(调试时频繁查阅) |
scripts/ |
编译、配置、分析工具脚本 | 低 |
tools/ |
用户态辅助工具,如 perf、objtool | 低 |
Documentation/ |
内核文档,包含调试、API说明 | 中(查阅参考) |
Makefile |
顶层构建文件,控制整个编译流程 | 高(编译选项配置) |
下图展示了内核源码顶层目录之间的逻辑关系与数据流向,帮助你建立宏观认知:
4.4 关键目录深入解析
对于内核调试而言,以下几个目录需要特别关注:
arch/ 目录
该目录按CPU架构划分子目录,例如 x86/、arm64/、riscv/。每个架构目录下包含:
boot/:启动相关代码,如内核入口点、解压缩程序。kernel/:架构特定的核心代码,如中断处理、系统调用入口。mm/:架构特定的内存管理,如页表操作。configs/:该架构的默认配置文件,如x86_64_defconfig。
kernel/ 目录
这是内核的“大脑”,包含:
sched/:进程调度器(CFS、RT等)。printk/:内核日志系统,kgdb依赖其输出。debug/:调试相关代码,包括kgdb核心框架gdb-serial.c。irq/:中断子系统。
drivers/ 目录
驱动代码按类型分类,调试驱动时需进入对应子目录:
tty/serial/:串口驱动,与kgdb的串口通信直接相关。net/:网络设备驱动。char/:字符设备驱动。
4.5 验证源码完整性
解压完成后,建议执行以下快速检查,确认源码未在传输过程中损坏:
# 检查顶层 Makefile 是否存在(核心标志)
ls -l Makefile
# 查看版本信息
head -5 Makefile
# 输出应包含类似:
# VERSION = 6
# PATCHLEVEL = 6
# SUBLEVEL = 7
# 统计文件数量(正常应在 80,000 左右)
find . -type f | wc -l
调试准备: 在后续章节中,我们将基于这份源码进行内核配置、编译,并生成带有调试符号的
vmlinux 文件。请确保当前目录路径中不包含中文或空格,以避免编译工具链解析错误。
至此,你已经成功获取并验证了Linux内核主线源码。下一阶段将进入内核配置环节,开启QEMU与kgdb联调的关键步骤。