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
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 最小系统时,我们需要遵循“只选必需,禁用无关”的原则。配置流程如下:
- 设置交叉编译工具链(如果尚未设置环境变量):
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
- 加载默认 vexpress 配置(避免从零开始):
make vexpress_defconfig
- 进入菜单配置界面:
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 |
[*] |
根文件系统常用格式 |
console=ttyAMA0 内核启动参数,即使驱动已编译,控制台也不会重定向到串口。
4.5 最小配置的依赖关系 SVG 图
下图展示了 vexpress 最小配置中各组件之间的依赖关系。箭头表示“依赖”或“需要”关系:
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 配合启动,并作为后续性能分析实验的基线镜像。任何额外的驱动或功能都将在这个最小配置基础上增量添加,从而精确控制变量,确保启动性能数据的可对比性。