2. Linux 内核实时性配置:内核源码获取、PREEMPT_RT 补丁应用、内核编译选项配置、实时内核编译与安装
构建实时性测试环境的核心是获得一个支持 PREEMPT_RT 完整抢占特性的 Linux 内核。本章将引导你完成从源码获取、补丁应用、配置优化到编译安装的全流程,确保内核具备可预测的低延迟调度能力。
2.1 内核源码与 PREEMPT_RT 补丁获取
实时内核的构建基于主线 Linux 内核源码与对应的 PREEMPT_RT 补丁集。版本匹配至关重要,补丁必须与内核源码的次版本号完全一致。
| 组件 | 获取源 | 版本匹配规则 |
|---|---|---|
| Linux 内核主线源码 | kernel.org 或镜像站 |
选择长期支持 (LTS) 版本,如 5.10.y、6.1.y |
| PREEMPT_RT 补丁 | rt.wiki.kernel.org 或 cdn.kernel.org/pub/linux/kernel/projects/rt/ |
补丁版本号必须与内核源码版本号完全一致,例如 patch-6.1.25-rt14.patch.xz |
版本选择建议: 对于实时性测试环境,推荐使用较新的 LTS 内核(如 6.1.x 或 6.6.x),它们拥有更完善的 PREEMPT_RT 支持和更丰富的调试追踪接口(如 osnoise、timerlat)。
2.1.1 下载与解压步骤
- 下载内核源码:
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.25.tar.xz tar -xf linux-6.1.25.tar.xz cd linux-6.1.25 - 下载并应用 PREEMPT_RT 补丁:
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.25-rt14.patch.xz xzcat patch-6.1.25-rt14.patch.xz | patch -p1
常见错误: 补丁应用失败通常由版本不匹配或源码目录不干净导致。应用补丁前,确保源码目录未被修改,可使用
git init && git add . && git commit -m "base" 创建基线,便于补丁冲突时回退。
2.2 内核编译选项配置:实时性关键开关
配置内核是决定实时性能的环节。必须启用 PREEMPT_RT 完整抢占模型,并调整时钟、中断、锁等相关选项。
2.2.1 配置方法
使用 make menuconfig 进行图形化配置,或直接编辑 .config 文件。以下为必须启用的关键选项:
| 配置项 | 路径 (menuconfig) | 推荐值 | 说明 |
|---|---|---|---|
CONFIG_PREEMPT_RT |
General setup → Preemption Model | Fully Preemptible Kernel (Real-Time) | 启用完整实时抢占,是 PREEMPT_RT 的核心开关 |
CONFIG_HZ_1000 |
Processor type and features → Timer frequency | 1000 Hz | 高时钟中断频率,提高调度时间精度 |
CONFIG_NO_HZ_FULL |
General setup → Timer tick handling | Full dynticks system (tickless) | 允许 CPU 在运行单个任务时关闭周期性 tick,减少干扰 |
CONFIG_IRQ_FORCED_THREADING |
Kernel Features → IRQ subsystem | Enable | 强制中断线程化,降低中断对实时任务的优先级反转 |
CONFIG_CPUSETS |
Kernel Features → Control Group support | Enable | 支持 CPU 隔离,为实时任务预留专用核心 |
2.2.2 配置验证命令
配置完成后,使用以下命令验证关键选项是否生效:
grep -E "PREEMPT_RT|HZ_1000|NO_HZ_FULL|IRQ_FORCED_THREADING" .config
输出应显示 =y 或 =m,例如:
CONFIG_PREEMPT_RT=y
CONFIG_HZ_1000=y
CONFIG_NO_HZ_FULL=y
CONFIG_IRQ_FORCED_THREADING=y
2.3 实时内核编译与安装
配置完成后,进入编译与安装阶段。建议使用多线程编译以加快速度,并安装必要的模块。
2.3.1 编译内核与模块
# 编译内核镜像与模块
make -j$(nproc) bzImage
make -j$(nproc) modules
# 安装模块
sudo make modules_install
# 安装内核与 System.map
sudo make install
2.3.2 更新引导加载器
安装完成后,更新 GRUB 配置并重启:
sudo update-grub
sudo reboot
重启后,在 GRUB 菜单中选择新安装的实时内核启动。通过以下命令确认内核已运行 PREEMPT_RT:
uname -a | grep PREEMPT
输出应包含 PREEMPT_RT 字样,例如:
Linux rt-test 6.1.25-rt14 #1 SMP PREEMPT_RT ...
2.4 实时内核配置与编译流程总览
下图展示了从源码获取到实时内核启动的完整流程,以及各阶段的关键产物。
2.5 常见问题与排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 补丁应用失败,大量 reject | 内核源码版本与补丁版本不匹配 | 重新下载匹配版本的源码与补丁,使用 git checkout . 恢复干净目录 |
| 编译过程中断,报 undefined reference | 配置选项冲突或依赖缺失 | 运行 make olddefconfig 自动修复默认值,然后重新编译 |
| 重启后内核 panic | initramfs 未正确生成或驱动缺失 | 使用 make install 自动生成 initramfs,或手动运行 mkinitramfs |
| 系统无法识别实时内核 | GRUB 未更新或默认启动项错误 | 运行 sudo update-grub,并在 BIOS/GRUB 菜单中手动选择实时内核 |
性能基线记录: 在安装实时内核后,建议立即使用
cyclictest 或 hwlatdetect 记录一次基准延迟数据,作为后续优化和对比的参考点。
完成以上步骤后,你的系统已运行支持 PREEMPT_RT 的实时内核。下一阶段将基于此环境部署 ftrace 追踪工具,开始对调度延迟进行细粒度测量与分析。