4. 内核配置选项总览:PREEMPT_RT 相关内核配置菜单、Kconfig 结构、配置依赖关系、配置工具使用
在深入调优之前,必须理解 PREEMPT_RT 在内核配置体系中的位置。本章将系统梳理相关配置菜单的入口、Kconfig 依赖树、关键选项的互斥关系,以及如何使用配置工具进行高效操作。掌握这些基础,才能避免“乱调参数、编译失败”的常见陷阱。
4.1 配置菜单入口与层级结构
PREEMPT_RT 相关选项主要集中在内核配置树的 “Processor type and features” 和 “Kernel Features” 两大菜单下。下表列出了核心配置项的路径与功能简述:
| 配置项 | 菜单路径 | 功能简述 |
|---|---|---|
CONFIG_PREEMPT_RT |
Kernel Features → Preemption Model | 启用全实时抢占,替换标准抢占模型 |
CONFIG_HZ_1000 |
Processor type and features → Timer frequency | 设置系统时钟中断频率为 1000Hz,降低调度延迟 |
CONFIG_HIGH_RES_TIMERS |
General setup → Timers subsystem | 启用高精度定时器,支撑微秒级定时精度 |
CONFIG_NO_HZ_FULL |
General setup → Timers subsystem → Full dynticks system | 全动态 tick,减少周期性中断对实时任务的干扰 |
CONFIG_IRQ_FORCED_THREADING |
Kernel Features → Force threading of all interrupts | 强制所有中断线程化,避免中断抢占实时任务 |
提示: 在
make menuconfig 中,输入 / 键可搜索任意配置项名称(如 PREEMPT_RT),直接跳转到其所在菜单位置,避免手动逐层查找。
4.2 Kconfig 依赖关系与互斥规则
PREEMPT_RT 并非独立选项,它与其他内核特性存在严格的 依赖(depends on) 和 互斥(select/conflict) 关系。理解这些规则是配置不出错的前提。
核心依赖链如下:
CONFIG_PREEMPT_RT依赖CONFIG_EXPERT被启用,否则不可见。CONFIG_PREEMPT_RT自动 selectCONFIG_IRQ_FORCED_THREADING,确保中断线程化。CONFIG_PREEMPT_RT与CONFIG_PREEMPT_NONE、CONFIG_PREEMPT_VOLUNTARY、CONFIG_PREEMPT互斥,只能选择其一。CONFIG_NO_HZ_FULL依赖CONFIG_NO_HZ_IDLE且CONFIG_TICK_CPU_ACCOUNTING为 y。
常见错误: 如果先启用了
CONFIG_PREEMPT(标准抢占),再尝试启用 CONFIG_PREEMPT_RT,配置工具会自动将前者置为 n。切勿手动强制修改,否则 make olddefconfig 会重置为默认值。
下面用 SVG 图展示 PREEMPT_RT 与周边配置项的依赖与互斥关系:
4.3 配置工具使用与最佳实践
Linux 内核提供多种配置工具,针对 PREEMPT_RT 调优,推荐以下工作流:
- 初始配置: 使用
make defconfig生成默认配置,然后执行make menuconfig进入图形界面。 - 搜索定位: 按
/键输入PREEMPT_RT,确认其依赖项EXPERT是否已启用。 - 启用实时模型: 进入
Kernel Features → Preemption Model,选择Fully Preemptible Kernel (Real-Time)。 - 调整时钟频率: 进入
Processor type and features → Timer frequency,选择1000 Hz。 - 验证依赖: 保存配置后执行
make olddefconfig,工具会自动处理依赖关系,输出无冲突提示。 - 差异对比: 使用
make savedefconfig生成精简配置,再用diff对比调优前后的变化。
效率技巧: 对于多架构或重复构建场景,使用
scripts/kconfig/merge_config.sh 脚本将 PREEMPT_RT 相关选项写入一个片段文件(如 rt.config),然后合并到基础配置中,避免每次手动选择。
下面用 SVG 图展示配置工具的工作流程与决策节点:
4.4 配置验证与冲突排查
配置完成后,务必执行以下验证步骤,确保实时配置生效且无冲突:
- 检查 .config 文件: 使用
grep PREEMPT .config确认CONFIG_PREEMPT_RT=y且CONFIG_PREEMPT未定义。 - 查看自动选择项: 执行
grep IRQ_FORCED_THREADING .config验证是否被自动置为 y。 - 检查时钟配置: 确认
CONFIG_HZ=1000且CONFIG_HIGH_RES_TIMERS=y。 - 使用脚本验证: 运行
scripts/rt-tests/rt-config-check.sh(如果存在)或手动检查上述关键项。
注意: 如果 .config 中同时出现
CONFIG_PREEMPT_RT=y 和 CONFIG_PREEMPT=y,说明配置已损坏。此时应执行 make mrproper 清理后重新配置,切勿直接编辑 .config 文件。
下表总结了常见配置冲突及其解决方案:
| 冲突现象 | 根因 | 解决方案 |
|---|---|---|
| PREEMPT_RT 选项灰色不可选 | CONFIG_EXPERT 未启用 | 在 General setup 中启用 EXPERT |
| 编译报错:undefined reference to `rt_mutex' | PREEMPT_RT 未正确 select 相关锁机制 | 执行 make olddefconfig 修复依赖 |
| 系统启动后调度延迟未改善 | CONFIG_HZ 仍为 250 或 100 | 手动设置为 1000Hz 并重新编译 |
| 中断延迟反而增加 | IRQ_FORCED_THREADING 未生效 | 检查 .config 中该选项是否为 y |