3. 实时内核补丁的编译环境准备

说实话,编译环境准备这事儿,看着简单,但坑特别多。我见过不少新手,一上来就急着打补丁、编译内核,结果环境没配好,折腾一整天连个内核镜像都没生成出来。嗯,咱们今天就把这块彻底捋清楚。

3.1 安装必要的编译工具链

先说说工具链。你想想看,内核编译本质上就是把C代码变成机器码,这中间需要编译器、链接器、各种头文件。我个人习惯用 gccmake,这是最经典的组合。

在 x86 平台上,直接装就行:

sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libncurses-dev
sudo apt-get install flex bison
sudo apt-get install libssl-dev
sudo apt-get install libelf-dev

这里我特别提一下 libncurses-dev,它是用来支持 menuconfig 图形化配置界面的。我曾经有一次忘了装这个,结果 make menuconfig 报错,查了半天才发现是缺了这个库。

小提示:如果你用的是 Ubuntu 20.04 或更早版本,记得确认一下 gcc 版本。太老的 gcc 可能不支持某些内核特性。我建议用 gcc-9 或更高版本。

3.2 配置内核编译选项

内核编译选项配置,说白了就是告诉内核:你要支持哪些功能、哪些驱动、哪些调度策略。对于实时内核补丁来说,有几个关键选项必须打开。

先进入内核源码目录,执行:

make menuconfig

然后找到以下选项并启用:

配置项 路径 说明
CONFIG_PREEMPT_RT General setup → Preemption Model 选择 Fully Preemptible Kernel (Real-Time)
CONFIG_HIGH_RES_TIMERS General setup → Timers subsystem 高精度定时器,实时系统必备
CONFIG_NO_HZ_FULL General setup → Timers subsystem 减少定时器中断干扰
CONFIG_CPU_FREQ Power management and ACPI CPU频率调节,实时任务需要稳定频率
注意:我曾经在配置时漏掉了 CONFIG_HIGH_RES_TIMERS,结果实时任务的时间精度只有 10ms,完全达不到工业控制的要求。这个选项一定要勾上。

配置完成后,保存退出。我个人习惯把配置文件备份一份:

cp .config config-rt-backup

这样万一改乱了,还能快速恢复。

3.3 设置交叉编译环境(针对ARM/嵌入式平台)

嵌入式平台和 x86 不一样,你得用交叉编译器。说白了,就是在你的 PC 上编译出能在 ARM 板子上运行的内核。

先下载交叉编译工具链。我常用 Linaro 的版本:

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

然后设置环境变量:

export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
export PATH=$PATH:/path/to/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

这里有个坑,我踩过好几次。就是 CROSS_COMPILE 后面的横线不能丢,它表示前缀。比如 arm-linux-gnueabihf-gcc,你只写 arm-linux-gnueabihf 是不行的。

验证一下工具链是否生效:

arm-linux-gnueabihf-gcc --version

如果能看到版本信息,说明环境配好了。

核心要点:交叉编译时,记得把 ARCHCROSS_COMPILE 都设对。我见过有人只设了 CROSS_COMPILE 忘了设 ARCH,结果编译出来的还是 x86 的内核。

3.4 知识体系结构图

下面这张图,是我自己总结的编译环境准备流程。你看一眼,心里就有数了:

实时内核补丁编译环境准备流程 安装编译工具链 gcc, make, libncurses 配置内核编译选项 CONFIG_PREEMPT_RT等 设置交叉编译环境 ARCH, CROSS_COMPILE x86平台:直接安装 ARM平台:交叉编译 menuconfig图形化配置 备份.config文件 设置环境变量 验证工具链版本 避坑总结 1. 别忘了装libncurses-dev 2. CROSS_COMPILE后面的横线不能丢

3.5 验证环境是否就绪

环境配好之后,我建议先做一次快速验证。别等到编译内核时才发现问题,那会儿排查起来就麻烦了。

写个简单的测试脚本:

#!/bin/bash
echo "检查工具链..."
which gcc || echo "gcc 未安装"
which make || echo "make 未安装"
which arm-linux-gnueabihf-gcc || echo "交叉编译器未安装"

echo "检查内核源码..."
ls -la /path/to/kernel/source/Makefile || echo "内核源码未找到"

echo "检查配置文件..."
ls -la /path/to/kernel/source/.config || echo "配置文件未生成"

跑一遍,如果所有检查都通过,那恭喜你,环境准备好了。接下来就可以开始打补丁了。

我的经验:每次换新机器或者重装系统,我都会先跑一遍这个脚本。省得后面编译到一半才发现缺东西,那感觉,嗯,你懂的。

公众号:蓝海资料掘金营,微信deep3321