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
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)和优先级继承协议,防止优先级反转。
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 工具集)测量中断延迟和调度延迟,以验证实时性能是否符合预期。典型硬实时系统的最大延迟应控制在几十微秒以内。