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 自动 select CONFIG_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 与周边配置项的依赖与互斥关系:

PREEMPT_RT Kconfig 依赖与互斥关系图 PREEMPT_RT Kconfig 依赖与互斥关系 CONFIG_PREEMPT_RT depends on EXPERT select IRQ_FORCED_THREADING PREEMPT_NONE PREEMPT_VOLUNTARY PREEMPT (标准) 互斥 说明 实线: 依赖/选择 虚线: 互斥关系 红色: 核心实时选项

4.3 配置工具使用与最佳实践

Linux 内核提供多种配置工具,针对 PREEMPT_RT 调优,推荐以下工作流:

  1. 初始配置: 使用 make defconfig 生成默认配置,然后执行 make menuconfig 进入图形界面。
  2. 搜索定位: 按 / 键输入 PREEMPT_RT,确认其依赖项 EXPERT 是否已启用。
  3. 启用实时模型: 进入 Kernel Features → Preemption Model,选择 Fully Preemptible Kernel (Real-Time)。
  4. 调整时钟频率: 进入 Processor type and features → Timer frequency,选择 1000 Hz。
  5. 验证依赖: 保存配置后执行 make olddefconfig,工具会自动处理依赖关系,输出无冲突提示。
  6. 差异对比: 使用 make savedefconfig 生成精简配置,再用 diff 对比调优前后的变化。
效率技巧: 对于多架构或重复构建场景,使用 scripts/kconfig/merge_config.sh 脚本将 PREEMPT_RT 相关选项写入一个片段文件(如 rt.config),然后合并到基础配置中,避免每次手动选择。

下面用 SVG 图展示配置工具的工作流程与决策节点:

PREEMPT_RT 配置工具工作流 PREEMPT_RT 配置工具工作流 make defconfig make menuconfig 搜索 /PREEMPT_RT 依赖满足? 是 否 启用 EXPERT 选择 PREEMPT_RT

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