3. 实时内核补丁的编译环境准备
说实话,编译环境准备这事儿,看着简单,但坑特别多。我见过不少新手,一上来就急着打补丁、编译内核,结果环境没配好,折腾一整天连个内核镜像都没生成出来。嗯,咱们今天就把这块彻底捋清楚。
3.1 安装必要的编译工具链
先说说工具链。你想想看,内核编译本质上就是把C代码变成机器码,这中间需要编译器、链接器、各种头文件。我个人习惯用 gcc 和 make,这是最经典的组合。
在 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 报错,查了半天才发现是缺了这个库。
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频率调节,实时任务需要稳定频率 |
配置完成后,保存退出。我个人习惯把配置文件备份一份:
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
如果能看到版本信息,说明环境配好了。
ARCH 和 CROSS_COMPILE 都设对。我见过有人只设了 CROSS_COMPILE 忘了设 ARCH,结果编译出来的还是 x86 的内核。
3.4 知识体系结构图
下面这张图,是我自己总结的编译环境准备流程。你看一眼,心里就有数了:
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