内核配置与裁剪
1. 概述
1.1 功能简介
Linux 内核提供了高度灵活的配置系统,允许开发者根据硬件平台和产品需求,精确选择需要编译的模块和功能。RK3576 基于 Linux 6.1 内核,通过 menuconfig 图形化配置界面和内核模块管理机制,可以实现对内核的精细控制和体积裁剪,以适应不同存储容量和性能要求的嵌入式产品。
1.2 应用场景
- 硬件适配:根据具体硬件配置(LPDDR5 内存、外设接口)调整内核驱动选项
- 体积优化:裁剪不需要的功能模块,减小内核体积
- 性能优化:关闭调试选项,启用特定硬件加速功能(NPU、GPU 等)
- 安全加固:禁用不必要的内核功能,减少攻击面
- 功耗优化:配置 CPU/GPU 调频策略、电源管理选项
1.3 工作原理
Linux 内核使用 Kconfig 配置系统,通过 make menuconfig 等工具生成 .config 配置文件,控制哪些功能被编译进内核(=y)、编译为模块(=m)或完全不编译。RK3576 在 SDK 中使用 rockchip_linux_defconfig 作为基础配置,并支持通过 *.config 片段文件叠加的方式添加特定功能配置。
原理类内容优先引用 RK 官方文档,此处仅做要点提炼。 详见 RK 官方文档(S-07):[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 存储设备 | eMMC / SD 卡(16GB+) | 1 | 存储系统镜像 |
| 电源适配器 | 5V 电源适配器(Type-C 或 6pin 输入) | 1 | 空载最小 1000mA |
2.2 硬件确认
连接串口,上电后确认系统正常启动,进入终端:
# 查看当前内核版本(应显示 6.1)
uname -a
# 预期输出示例
Linux rk3576 6.1.x #1 SMP ... aarch64 GNU/Linux
# 查看内核配置(如果内核开启了 CONFIG_IKCONFIG)
zcat /proc/config.gz3. 软件准备
3.1 环境要求
- Ubuntu 20.04/22.04 开发环境
- RK3576 Linux SDK 已正确配置(获取方式见 资料下载)
- 交叉编译工具链已安装(SDK 内置 GCC 10.3)
3.2 进入内核配置环境
cd <SDK_PATH>/kernel
# 加载默认配置(基于所选的板级配置)
make ARCH=arm64 rockchip_linux_defconfig
# 或使用 SDK 的 build.sh 进入配置
cd <SDK_PATH>
./build.sh kernel
# 在编译过程中中断后进入 kernel 目录进行配置3.3 内核配置文件路径
| 文件 | 说明 | 路径 |
|---|---|---|
.config | 当前内核配置 | <SDK>/kernel/.config |
rockchip_linux_defconfig | RK3576 默认配置 | kernel/arch/arm64/configs/rockchip_linux_defconfig |
*.config 片段 | 功能片段配置 | kernel/arch/arm64/configs/ |
| 内核模块配置 | 模块配置文件 | buildroot/package/rockchip/*.config |
4. 操作步骤
4.1 使用 menuconfig 进行内核配置
cd <SDK_PATH>/kernel
make ARCH=arm64 menuconfig常用操作键:
| 按键 | 功能 |
|---|---|
↑ ↓ | 上下移动光标 |
Enter | 进入子菜单 |
Y | 编译进内核(*) |
M | 编译为模块(M) |
N | 不编译 |
? | 查看帮助信息 |
/ | 搜索配置项 |
Space | 循环切换 Y/M/N |
Esc + Esc | 返回上级菜单 |
Tab | 切换焦点到按钮 |
示例:搜索特定配置项
按 / 键,输入搜索关键字,例如 CONFIG_DRM:
Symbol: DRM [=y]
Type : bool
Prompt: Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
Location:
-> Device Drivers
-> Graphics support
Defined at drivers/gpu/drm/Kconfig:124.2 内核模块管理
查看已加载模块
# 在目标板上执行
lsmod
# 查看模块详细信息
modinfo <module_name>
# 查看模块参数
modinfo -p <module_name>加载/卸载模块
# 加载模块
insmod /path/to/module.ko
modprobe <module_name>
# 卸载模块
rmmod <module_name>
modprobe -r <module_name>模块自动加载配置
在 /etc/modules 或 /etc/modules-load.d/ 目录下添加模块名,可实现开机自动加载:
# /etc/modules
# 每行一个模块名
g_mass_storage4.3 设备驱动配置
4.3.1 显示驱动配置
Device Drivers → Graphics support →
<*> Direct Rendering Manager (DRM)
[*] DRM driver for Rockchip
[*] Rockchip VOP2
<*> Rockchip VOP2 gamma LUT
<*> DRM bridge IC support4.3.2 NPU 驱动配置
RK3576 内置 NPU(6 TOPS INT8),需要在内核中启用 NPU 驱动:
Device Drivers →
<*> Rockchip NPU support确认内核配置中
CONFIG_ROCKCHIP_NPU=y,设备树中rknpu节点status = "okay"。 详见核心板规格书:NPU 算力高达 6 TOPS(INT8),支持 INT4/INT8/INT16 混合运算。
4.3.3 多媒体驱动配置
Device Drivers → Multimedia support →
<*> Rockchip Camera driver
<*> Rockchip ISP driver
<*> Video4Linux (V4L) drivers4.3.4 网络驱动配置
Device Drivers → Network device support →
<*> Ethernet driver support
<*> Rockchip GMAC driver
<*> Wireless LAN
<*> Rockchip WiFi driver(含 WiFi5/BT5.0 模块对应驱动)4.3.5 USB 驱动配置
Device Drivers → USB support →
<*> Support for Host-side USB
<*> Rockchip USB controller
<*> USB Gadget Support
<*> USB Gadget functions4.3.6 IO 电源域配置
RK3576 有多个 IO 电源域,在设备树中通过 pmu_io_domains 节点配置。内核需要开启对应的驱动支持:
Device Drivers →
<*> Rockchip IO Voltage Domain support4.4 内核裁剪减小体积
4.4.1 裁剪策略
| 策略 | 操作 | 预期效果 |
|---|---|---|
| 关闭调试选项 | 关闭 CONFIG_DEBUG_KERNEL、CONFIG_PRINTK 等 | 减少 ~2-5MB |
| 移除不用的驱动 | 关闭未使用的网卡、声卡、摄像头驱动 | 减少 ~1-3MB |
| 使用模块化 | 将不常用驱动编译为模块(=m) | 减小内核镜像体积 |
| 关闭文件系统支持 | 仅保留需要的文件系统类型 | 减少 ~0.5-1MB |
| 关闭网络协议栈 | 如不需要网络,可裁剪 | 减少 ~1-2MB |
4.4.2 建议关闭的配置项
# 调试选项(量产固件建议关闭)
CONFIG_DEBUG_KERNEL=n
CONFIG_DEBUG_INFO=n
CONFIG_DYNAMIC_DEBUG=n
CONFIG_PRINTK=n # 如不需要内核日志
CONFIG_MAGIC_SYSRQ=n
# 不常用的文件系统
CONFIG_F2FS_FS=n
CONFIG_BTRFS_FS=n
CONFIG_XFS_FS=n
CONFIG_JFS_FS=n
CONFIG_REISERFS_FS=n
# 不常用的网络协议
CONFIG_IPV6=n # 如不需要 IPv6
CONFIG_WIRELESS=n # 如不需要 WiFi
CONFIG_BT=n # 如不需要蓝牙
# 不相关的驱动
CONFIG_SOUND=n # 如不需要音频
CONFIG_DRM=n # 如不需要显示(无头设备)4.4.3 使用内核片段配置
RK3576 SDK 支持配置片段文件,用于叠加修改:
# 查看已有片段
ls kernel/arch/arm64/configs/可以在 buildroot/configs/rockchip/ 下找到按功能分类的配置片段:
ls buildroot/configs/rockchip/这些片段在 Buildroot 编译时会自动合并到内核配置中。
4.5 保存配置并编译
# 保存配置到 .config
make ARCH=arm64 savedefconfig
# 将精简后的配置保存为默认配置
cp defconfig arch/arm64/configs/rockchip_linux_defconfig
# 编译内核
cd <SDK_PATH>
./build.sh kernel如果使用 Buildroot 构建,内核配置通过 Buildroot 管理:
# 在 Buildroot 中配置内核
make linux-menuconfig
# 保存内核配置到 Buildroot 的默认配置
make linux-update-defconfig5. 代码详解
5.1 Kconfig 语法
Kconfig 是内核配置系统的核心,定义了所有配置选项的层次结构和依赖关系:
# 定义菜单项
menu "Rockchip Drivers"
# 布尔选项(Y/N)
config ROCKCHIP_DRM_VOP
bool "Rockchip VOP driver"
depends on DRM_ROCKCHIP
default y
help
Rockchip VOP (Video Output Processor) driver.
# 三态选项(Y/M/N)
config ROCKCHIP_WIFI
tristate "Rockchip WiFi support"
depends on WLAN
help
Rockchip WiFi module support.
endmenu5.2 Makefile 条件编译
内核源码中使用 Makefile 根据 .config 的配置项进行条件编译:
# 当 CONFIG_ROCKCHIP_DRM_VOP=y 时编译 vop.o
obj-$(CONFIG_ROCKCHIP_DRM_VOP) += vop.o
# 当 CONFIG_ROCKCHIP_WIFI=m 时编译为模块
obj-$(CONFIG_ROCKCHIP_WIFI) += rkwifi.o5.3 查看最终生效的配置
# 在目标板上查看实际配置
cat /proc/config.gz | gunzip > /tmp/running_config
# 对比编译时配置和实际运行配置
diff <SDK>/kernel/.config /tmp/running_config6. 常见问题
6.1 menuconfig 显示乱码
现象: make menuconfig 界面显示乱码或无法正常显示
解决方案:
sudo apt-get install libncurses5-dev
export LANG=en_US.UTF-86.2 内核编译后无法启动
现象: 编译烧录后内核崩溃(Kernel Panic)或无法挂载根文件系统
解决方案:
- 确认保留了
CONFIG_EXT4_FS=y(根文件系统通常是 ext4) - 确认保留了
CONFIG_MMC_BLOCK=y(eMMC/SD 卡驱动) - 使用原始配置重新编译,逐步裁剪定位问题
6.3 模块加载失败
现象: modprobe 提示 Module XXX not found 或 Invalid module format
解决方案:
# 查看模块版本信息
modinfo <module>.ko
# 查看内核版本
uname -r
# 确认模块与内核版本一致相关文档
- Linux_SDK编译 — SDK 编译流程
- 设备树详解与实践 — 设备树配置
- SDK下载与编译环境搭建 — 环境搭建
- 核心板参数 — 硬件事实基线
