4. Linux 内核源码获取与配置:针对 vexpress 板卡的最小配置

本章是 QEMU 调试 Linux 内核的起点。我们将从 kernel.org 获取主线内核源码,然后通过 make menuconfig 进行配置,最终生成一个仅包含 vexpress 板卡必要驱动的最小内核镜像。这一过程不仅为后续的 QEMU 启动和性能分析奠定基础,也是理解内核裁剪与嵌入式系统资源约束的关键实践。

4.1 从 kernel.org 获取内核源码

Linux 内核官方发布站点为 https://www.kernel.org。我们选择长期支持(LTS)版本以获得稳定的调试环境。以下为获取与解压的标准步骤:

# 下载内核源码(以 6.1.y LTS 为例)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.xz

# 校验完整性(可选)
sha256sum linux-6.1.76.tar.xz

# 解压
tar -xf linux-6.1.76.tar.xz
cd linux-6.1.76
版本选择建议: 对于 QEMU + vexpress 调试场景,推荐使用 5.10.y 或 6.1.y LTS 版本。这些版本对 ARM 架构支持成熟,且与 QEMU 7.2+ 的兼容性最好。避免使用 -rc 候选版本,因其驱动接口可能不稳定。

4.2 内核源码目录结构速览

理解源码顶层目录结构有助于后续配置时快速定位驱动和架构代码。下表列出了与嵌入式调试最相关的目录:

目录 内容说明 调试关注点
arch/arm/ ARM 架构相关代码,包括启动、MMU、中断 vexpress 板级文件位于 arch/arm/mach-vexpress/
arch/arm/boot/dts/ 设备树源文件(.dts) vexpress-v2p-ca9.dts 是 QEMU 默认使用的设备树
drivers/ 所有设备驱动 重点关注 clk、irqchip、timer、serial、mmc
kernel/ 核心调度、进程管理 启动性能分析时关注 kernel/sched/ 和 kernel/time/
init/ 内核初始化流程 main.c 中的 start_kernel 是调试入口
include/ 全局头文件 ARM 相关定义在 include/linux/ 和 arch/arm/include/

4.3 配置内核:make menuconfig 详解

make menuconfig 是基于 ncurses 的文本界面配置工具。在配置 vexpress 最小系统时,我们需要遵循“只选必需,禁用无关”的原则。配置流程如下:

  1. 设置交叉编译工具链(如果尚未设置环境变量):
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
  1. 加载默认 vexpress 配置(避免从零开始):
make vexpress_defconfig
  1. 进入菜单配置界面:
make menuconfig

在 menuconfig 界面中,使用方向键导航、空格键切换选择状态([*] 表示编译进内核,[M] 表示编译为模块,[ ] 表示禁用)。

4.4 vexpress 最小配置清单

以下配置项是 vexpress 板卡在 QEMU 中启动并输出控制台信息的最小集合。其他所有驱动、文件系统、网络功能均可禁用。

配置路径 配置项 状态 说明
System Type → ARM system type ARM Ltd. Versatile Express [*] 必须选中,否则无法识别 vexpress 板级
System Type → Versatile Express platform type ARM Versatile Express (VE) family [*] 选择 vexpress 家族
Kernel Features Use the ARM EABI to compile the kernel [*] 必须启用,否则无法运行用户空间程序
Boot options → Default kernel command string console=ttyAMA0,115200 root=/dev/mmcblk0 rw 手动输入 指定串口控制台和根文件系统
Device Drivers → Character devices → Serial drivers ARM AMBA PL011 serial port support [*] vexpress 使用 PL011 串口
Device Drivers → Block devices RAM block device support [*] 用于 initramfs 启动
Device Drivers → MMC/SD/SDIO card support ARM AMBA PL180/181 MMC controller [*] QEMU vexpress 默认 MMC 控制器
File systems → <*> Ext3 journalling file system support Ext3 [*] 根文件系统常用格式
常见配置陷阱: 如果忘记启用 PL011 串口驱动,内核启动后将没有任何控制台输出,导致调试完全无法进行。同样,如果未设置 console=ttyAMA0 内核启动参数,即使驱动已编译,控制台也不会重定向到串口。

4.5 最小配置的依赖关系 SVG 图

下图展示了 vexpress 最小配置中各组件之间的依赖关系。箭头表示“依赖”或“需要”关系:

vexpress 最小内核配置依赖关系 ARM EABI vexpress 板级支持 PL011 串口驱动 PL180 MMC 驱动 RAM 块设备 控制台输出 根文件系统访问 initramfs 加载 用户空间 init 进程 (/init 或 /sbin/init) 说明:所有绿色节点为必须编译进内核的驱动,橙色节点为启动时依赖的功能,紫色为用户空间入口。

4.6 配置保存与验证

完成 menuconfig 配置后,按 Exit 退出并选择 Yes 保存配置。配置内容会写入源码根目录下的 .config 文件。建议执行以下验证步骤:

# 检查关键配置是否生效
grep -E "CONFIG_ARCH_VEXPRESS|CONFIG_SERIAL_AMBA_PL011|CONFIG_MMC_ARMMMCI" .config

预期输出应包含以下内容:

CONFIG_ARCH_VEXPRESS=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_MMC_ARMMMCI=y
配置备份建议: 将最小配置保存为独立文件,方便后续复用:cp .config config-vexpress-minimal。在后续章节中,我们将在该最小配置基础上逐步添加调试符号、跟踪点和性能计数器等特性。

4.7 常见配置问题与排查

问题现象 可能原因 解决方案
QEMU 启动后无任何输出 PL011 串口驱动未编译或内核参数未设置 确认 CONFIG_SERIAL_AMBA_PL011=y 且 cmdline 包含 console=ttyAMA0
内核 panic: VFS: Unable to mount root fs MMC 驱动缺失或根文件系统格式不支持 启用 CONFIG_MMC_ARMMMCI 和 CONFIG_EXT3_FS
编译错误:undefined reference to `arm_delay_ops' ARM 定时器相关配置被裁剪 确保 CONFIG_ARM_ARCH_TIMER 或 CONFIG_ARM_GLOBAL_TIMER 已启用
menuconfig 界面无法显示 缺少 ncurses 库 安装 libncurses-dev(Ubuntu)或 ncurses-devel(Fedora)

4.8 本章小结

通过本章操作,我们完成了以下关键任务:

  • 从 kernel.org 获取并解压了 LTS 内核源码
  • 使用 make vexpress_defconfig 加载了板级默认配置
  • 通过 make menuconfig 手动裁剪出仅包含 PL011 串口、PL180 MMC 控制器和 Ext3 文件系统的最小配置
  • 验证了 .config 文件中关键配置项的状态

这个最小配置内核将在第 5 章中与 QEMU 配合启动,并作为后续性能分析实验的基线镜像。任何额外的驱动或功能都将在这个最小配置基础上增量添加,从而精确控制变量,确保启动性能数据的可对比性。