3. PREEMPT_RT补丁的获取与编译
本章是构建实时Linux系统的核心实操环节。我们将从获取与内核版本精确匹配的PREEMPT_RT补丁开始,逐步完成内核配置、编译与安装。正确执行这些步骤是后续中断线程化移植的基础。
3.1 获取PREEMPT_RT补丁与内核源码
PREEMPT_RT补丁并非独立内核,而是针对特定主线内核版本的增量补丁。必须确保内核源码版本与补丁版本完全一致。
版本匹配原则: 例如,补丁文件
patch-5.10.210-rt93.patch.xz 必须应用于 linux-5.10.210 的内核源码树。版本号任何一位不匹配都会导致补丁失败。
3.1.1 下载内核源码
从 kernel.org 获取主线内核源码。
# 下载指定版本的内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.210.tar.xz
# 解压源码
tar -xf linux-5.10.210.tar.xz
cd linux-5.10.210
3.1.2 下载RT补丁
从 kernel.org/pub/linux/kernel/projects/rt/ 获取对应版本的PREEMPT_RT补丁。
# 下载RT补丁
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.210-rt93.patch.xz
# 解压补丁
xz -d patch-5.10.210-rt93.patch.xz
常见错误: 不要使用
git clone 直接拉取LTS内核分支,除非你明确知道该分支对应的RT补丁版本。最稳妥的方式是下载指定版本的tar包和补丁。
3.2 应用RT补丁
使用 patch 命令将RT补丁应用到内核源码树。
# 进入内核源码目录
cd linux-5.10.210
# 应用补丁(-p1 表示去掉路径中的第一级目录)
patch -p1 < ../patch-5.10.210-rt93.patch
补丁应用成功后,终端不会输出任何错误信息。可以通过查看内核顶层Makefile中的 EXTRAVERSION 字段确认补丁已生效。
# 检查补丁是否应用成功
head -5 Makefile
# 输出示例:
# VERSION = 5
# PATCHLEVEL = 10
# SUBLEVEL = 210
# EXTRAVERSION = -rt93
# NAME = Kleptomaniac Octopus
验证要点: 如果
EXTRAVERSION 字段包含 -rt93,说明补丁应用成功。如果出现 *.rej 文件,表示补丁冲突,需要手动解决。
3.3 配置内核选项
应用RT补丁后,内核源码中新增了实时性相关的配置选项。核心是启用 CONFIG_PREEMPT_RT_FULL。
3.3.1 关键配置选项
| 配置项 | 推荐值 | 说明 |
|---|---|---|
CONFIG_PREEMPT_RT_FULL |
y | 启用完全实时抢占,这是RT补丁的核心开关 |
CONFIG_HZ_1000 |
y | 设置内核时钟频率为1000Hz,提高定时精度 |
CONFIG_NO_HZ_FULL |
y | 自适应滴答模式,减少不必要的时钟中断 |
CONFIG_CPU_ISOLATION |
y | 支持CPU隔离,将指定CPU专用于实时任务 |
CONFIG_IRQ_FORCED_THREADING |
y | 强制中断线程化,这是中断线程化的基础 |
3.3.2 配置步骤
- 加载默认配置: 基于当前系统的配置生成
.config文件。
# 使用当前系统的配置作为起点
make olddefconfig
- 进入菜单配置: 使用
menuconfig图形化界面进行配置。
# 启动菜单配置界面
make menuconfig
- 启用实时抢占: 在菜单中依次进入
General setup→Preemption Model,选择Fully Preemptible Kernel (Real-Time)。
配置路径: 选择
Fully Preemptible Kernel (Real-Time) 后,内核会自动设置 CONFIG_PREEMPT_RT_FULL=y 以及相关的依赖选项。
- 验证配置: 保存退出后,检查
.config文件确认关键选项已启用。
# 验证关键配置
grep -E "PREEMPT_RT|HZ_1000|IRQ_FORCED_THREAD" .config
# 期望输出:
# CONFIG_PREEMPT_RT_FULL=y
# CONFIG_HZ_1000=y
# CONFIG_IRQ_FORCED_THREADING=y
3.4 编译与安装RT内核
配置完成后,进入编译阶段。RT内核的编译过程与标准内核一致,但需要关注编译选项以优化实时性能。
3.4.1 编译内核
# 设置编译线程数(通常为CPU核心数的2倍)
export MAKE="make -j$(nproc)"
# 编译内核镜像和模块
$MAKE bzImage
$MAKE modules
3.4.2 安装内核与模块
# 安装内核模块到 /lib/modules/5.10.210-rt93/
sudo make modules_install
# 安装内核镜像到 /boot/
sudo make install
3.4.3 更新引导加载器
安装完成后,需要更新GRUB配置以引导新内核。
# 更新GRUB配置
sudo update-grub
# 重启系统并选择RT内核
sudo reboot
启动验证: 重启后,使用
uname -a 检查内核版本是否包含 PREEMPT RT 字样。如果显示 #1 SMP PREEMPT_RT,说明RT内核已成功启动。
3.5 编译流程与关键节点
下图展示了从源码获取到RT内核启动的完整流程,以及每个阶段的关键验证点。
3.6 常见问题与排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
补丁应用失败,出现 *.rej 文件 |
内核源码版本与补丁版本不匹配 | 重新下载匹配版本的源码和补丁 |
menuconfig 中找不到 PREEMPT_RT_FULL |
补丁未正确应用 | 检查 EXTRAVERSION,重新应用补丁 |
编译过程中出现 undefined reference 错误 |
配置选项依赖未满足 | 运行 make olddefconfig 自动修复依赖 |
启动后 uname -a 不显示 PREEMPT_RT |
GRUB 未引导新内核 | 检查 /boot 目录,手动更新 GRUB 配置 |
最佳实践: 建议在编译前保存一份
.config 文件的备份。如果编译过程中需要调整配置,可以基于备份文件重新配置,避免重复从头开始。