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 顶层构建文件,控制整个编译流程 高(编译选项配置)

下图展示了内核源码顶层目录之间的逻辑关系与数据流向,帮助你建立宏观认知:

Linux 内核源码顶层目录逻辑关系图 arch/ (体系结构) kernel/ (核心内核) mm/ (内存管理) drivers/ (设备驱动) fs/ (文件系统) net/ (网络协议栈) include/ (头文件) scripts/ (构建脚本) Documentation/ (文档) 体系相关 核心功能 驱动/子系统 支撑/工具

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联调的关键步骤。