4. PREEMPT_RT 内核编译:获取源码、应用补丁、内核配置选项详解与编译安装

将标准 Linux 内核转换为实时操作系统,核心步骤是获取匹配的内核源码与 PREEMPT_RT 补丁,正确配置内核选项,并完成编译与安装。本章将详细拆解这一完整流程,确保你能够独立构建一个具备硬实时能力的 PREEMPT_RT 内核。

版本匹配原则:PREEMPT_RT 补丁与内核主版本号必须严格对应。例如,补丁 patch-6.1.25-rt14.patch.gz 只能应用于 linux-6.1.25.tar.xz 源码。使用不匹配的版本会导致补丁失败或内核运行异常。

4.1 获取内核源码与 PREEMPT_RT 补丁

源码与补丁的获取是构建实时内核的第一步,推荐从官方或长期维护(LTS)分支获取,以保证稳定性和安全更新。

资源类型 获取地址 说明
内核主线源码 https://www.kernel.org/ 推荐选择带有“LTS”标识的长期支持版本,如 6.1.x、5.15.x
PREEMPT_RT 补丁 https://cdn.kernel.org/pub/linux/kernel/projects/rt/ 按内核主版本号进入对应目录,下载 .patch.gz 或 .patch.xz 文件
Git 仓库(备选) git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git 适用于需要跟踪最新开发分支或进行定制化修改的场景

典型下载命令示例:

# 下载内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.25.tar.xz

# 下载对应的 RT 补丁
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.1/older/patch-6.1.25-rt14.patch.xz

# 解压源码
tar -xf linux-6.1.25.tar.xz
cd linux-6.1.25
源码与补丁获取流程 kernel.org 主线源码 (LTS) RT 补丁仓库 cdn.kernel.org/rt/ 版本匹配校验 主版本号必须一致 解压源码 tar -xf linux-6.1.25.tar.xz 应用 RT 补丁 patch -p1 < patch-*.xz 准备内核配置 make menuconfig

4.2 应用 PREEMPT_RT 补丁

补丁应用是构建实时内核的关键步骤。补丁会修改内核调度器、中断处理、锁机制等核心子系统,引入可抢占特性。

标准补丁应用命令:

# 进入解压后的内核源码目录
cd linux-6.1.25

# 解压并应用补丁(使用 xz 格式)
xzcat ../patch-6.1.25-rt14.patch.xz | patch -p1 --dry-run

# 确认无错误后,移除 --dry-run 正式应用
xzcat ../patch-6.1.25-rt14.patch.xz | patch -p1
补丁失败排查:如果 --dry-run 输出包含 Hunk #X FAILED 信息,说明源码与补丁版本不匹配或源码已被修改。此时应检查内核版本号是否完全一致,或从干净的源码重新开始。

4.3 内核配置选项详解

应用补丁后,内核配置菜单中会出现实时相关的选项。正确配置这些选项是发挥 PREEMPT_RT 性能的核心。

4.3.1 核心实时抢占模型配置

在 Kernel Features 菜单下,需要选择抢占模型。PREEMPT_RT 补丁会新增 Fully Preemptible Kernel (Real-Time) 选项。

配置项 宏定义 说明
No Forced Preemption (Server) CONFIG_PREEMPT_NONE 服务器默认配置,抢占延迟最高,不适合实时
Voluntary Kernel Preemption (Desktop) CONFIG_PREEMPT_VOLUNTARY 桌面系统默认,增加自愿抢占点,延迟有所改善
Preemptible Kernel (Low-Latency Desktop) CONFIG_PREEMPT 低延迟桌面,内核大部分可抢占,适用于软实时
Fully Preemptible Kernel (Real-Time) CONFIG_PREEMPT_RT_FULL PREEMPT_RT 核心选项,启用完全可抢占,实现硬实时能力
关键配置:选择 Fully Preemptible Kernel (Real-Time) 后,内核会自动启用一系列依赖选项,包括 CONFIG_PREEMPT_RT、CONFIG_HIGH_RES_TIMERS 等。这是构建实时内核的“总开关”。

4.3.2 其他关键实时相关配置

除了抢占模型,以下配置项对实时性能有显著影响:

  • CONFIG_HZ_1000:将内核时钟频率设置为 1000Hz,提供更细粒度的定时器分辨率,减少调度延迟。
  • CONFIG_NO_HZ_FULL:全无滴答模式,允许在单个 CPU 上完全关闭周期性时钟中断,减少抖动。
  • CONFIG_RCU_NOCB_CPU:将 RCU 回调处理卸载到专用 CPU,减少实时任务的干扰。
  • CONFIG_IRQ_FORCED_THREADING:强制所有中断线程化,使中断处理可被实时任务抢占。
  • CONFIG_PREEMPT_RT_FULL:启用实时互斥体(rt_mutex)和优先级继承协议,防止优先级反转。
PREEMPT_RT 内核配置依赖关系 CONFIG_PREEMPT_RT_FULL CONFIG_PREEMPT_RT CONFIG_HIGH_RES_TIMERS CONFIG_IRQ_FORCED_THREADING CONFIG_RT_MUTEXES CONFIG_HZ_1000 CONFIG_NO_HZ_FULL CONFIG_RCU_NOCB_CPU CONFIG_PREEMPT_RCU

4.4 编译与安装步骤

配置完成后,进入编译阶段。推荐使用 make -jN 并行编译以加快速度,其中 N 为 CPU 核心数加 1。

完整编译安装命令序列:

# 1. 加载现有配置作为基础(可选)
zcat /proc/config.gz > .config

# 2. 进入配置菜单,选择 PREEMPT_RT_FULL
make menuconfig

# 3. 编译内核和模块
make -j$(nproc)

# 4. 编译内核模块
make modules_install

# 5. 安装内核
make install

# 6. 更新引导加载程序(以 GRUB 为例)
update-grub
编译优化建议:对于嵌入式系统,可以在 make menuconfig 中关闭不需要的驱动和文件系统支持,以减小内核体积并缩短编译时间。使用 make localmodconfig 可以基于当前系统加载的模块自动生成最小配置。

4.4.1 验证安装

重启系统后,在 GRUB 菜单中选择新安装的实时内核。进入系统后,通过以下命令验证:

# 查看当前内核版本
uname -r

# 检查 PREEMPT_RT 是否启用
cat /proc/sys/kernel/sched_rt_runtime_us

# 查看内核配置是否包含 PREEMPT_RT
zcat /proc/config.gz | grep PREEMPT_RT

如果输出包含 CONFIG_PREEMPT_RT_FULL=y,并且 /proc/sys/kernel/sched_rt_runtime_us 存在,说明实时内核已成功安装并运行。

性能基准测试:安装完成后,建议使用 cyclictest(来自 rt-tests 工具集)测量中断延迟和调度延迟,以验证实时性能是否符合预期。典型硬实时系统的最大延迟应控制在几十微秒以内。