内核配置与裁剪
本文档介绍 RK3588 Linux 内核(基于 Linux 6.1)的 Kconfig 配置系统、menuconfig 使用、模块管理以及针对硬件平台的裁剪策略。
适用范围: 在 PC 上的 RK3588 Linux SDK 中配置和裁剪内核,C-3588LQ V1.0 + SHIMETAPI-M5-R2A V1.0 底板硬件平台。
1. 概念基础
1.1 内核配置系统
Linux 内核使用 Kconfig 配置系统,通过 make menuconfig 等工具生成 .config 文件,控制:
| 状态标记 | 含义 | 体积影响 |
|---|---|---|
=y | 编译进内核 | 增大内核镜像 |
=m | 编译为模块 | 模块按需加载 |
| (留空) | 不编译 | 减小镜像,但功能缺失 |
RK3588 在 SDK 中默认使用 rockchip_linux_defconfig 作为基础配置(defconfig 是内核默认配置文件的统称),并支持 *.config 片段文件叠加。
1.2 RK3588 内核特性
- 基础版本:Linux 6.1(
CONFIG_ROCKCHIP_VOP2=y而非 RK3568 的CONFIG_ROCKCHIP_VOP) - 双簇 CPU:小核 Cortex-A55 + 大核 Cortex-A76,共 8 核
- 内置 NPU(6 TOPS):
CONFIG_ROCKCHIP_NPU=y - 内置 VOP2/VOP3 显示控制器
2. 准备工作
2.1 硬件 / 软件清单
| 项目 | 内容 |
|---|---|
| 主控板 | C-3588LQ 核心板 + SHIMETAPI-M5-R2A 底板 |
| 调试串口线 | USB 转 TTL(3.3V),波特率 1500000 |
| 存储设备 | eMMC / SD 卡(16GB+) |
| 开发电脑 | Ubuntu 20.04/22.04,已配置 RK3588 Linux SDK |
2.2 确认设备当前内核
开发板:确认内核版本(用于对照裁剪目标):
uname -r输出:
6.1.141uname -a输出:
Linux linaro-alip 6.1.141 #11 SMP Fri Oct 9 10:22:09 CST 2026 aarch64 GNU/Linuxzcat /proc/config.gz | head -5/proc/config.gz 存在(47307 bytes),解压后即可查看当前正在运行的内核配置。
3. menuconfig 操作
3.1 进入配置界面
电脑端:
cd <SDK_PATH>/kernel
# 加载默认配置
make ARCH=arm64 rockchip_linux_defconfig
# 启动图形化配置
make ARCH=arm64 menuconfig也可以通过 SDK 入口间接进入:
cd <SDK_PATH>
./build.sh kernel # 在编译过程中断(Ctrl+C)后会自动进入 kernel 目录3.2 操作键速查
| 按键 | 功能 |
|---|---|
↑ ↓ | 上下移动光标 |
Enter | 进入子菜单 |
Y | 编译进内核(*) |
M | 编译为模块(M) |
N | 不编译 |
? | 查看帮助信息 |
/ | 搜索配置项 |
Space | 循环切换 Y/M/N |
Esc Esc | 返回上级菜单 |
Tab | 切换焦点到按钮 |
3.3 搜索配置项
按 / 键输入关键字(例如 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:123.4 内核配置文件路径
| 文件 | 说明 | 路径 |
|---|---|---|
.config | 当前生效的内核配置 | <SDK>/kernel/.config |
rockchip_linux_defconfig | RK3588 默认配置 | kernel/arch/arm64/configs/rockchip_linux_defconfig |
*.config 片段 | 功能片段配置 | kernel/arch/arm64/configs/ |
4. 模块管理(开发板端)
4.1 查看已加载模块
开发板:
lsmod # 列出已加载模块
modinfo <module_name> # 模块详细信息
modinfo -p <module_name> # 模块参数4.2 加载 / 卸载模块
开发板:
insmod /path/to/module.ko # 加载单个模块
modprobe <module_name> # 按依赖关系加载
rmmod <module_name> # 卸载
modprobe -r <module_name> # 连带卸载依赖4.3 模块开机自动加载
开发板: 在 /etc/modules-load.d/ 下放一个 .conf 文件:
# 创建自定义自动加载列表
cat > /etc/modules-load.d/my-modules.conf << 'EOF'
g_mass_storage
rtl8821cu
EOF重启后系统会自动
modprobe这些模块。
5. 设备驱动配置关键项
RK3588 SDK 的典型配置路径:
5.1 显示驱动配置
Device Drivers → Graphics support →
<*> Direct Rendering Manager (DRM)
[*] DRM driver for Rockchip
[*] Rockchip VOP2
<*> Rockchip VOP2 gamma LUT
<*> DRM bridge IC support5.2 NPU 驱动
Device Drivers →
<*> Rockchip NPU support确认:出厂 SDK 已启用 NPU。开发板上执行
dmesg | grep rknpu会显示RKNPU fdab0000.npu: RKNPU: rknpu iommu is enabled。
5.3 多媒体驱动
Device Drivers → Multimedia support →
<*> Rockchip Camera driver
<*> Rockchip ISP driver
<*> Video4Linux (V4L) drivers5.4 网络驱动
Device Drivers → Network device support →
<*> Ethernet driver support
<*> Rockchip GMAC driver
<*> Wireless LAN
<*> Realtek 8821CU/8811CU support5.5 USB 驱动
Device Drivers → USB support →
<*> Support for Host-side USB
<*> Rockchip USB controller
<*> USB Gadget Support
<*> USB Gadget functions5.6 IO 电压域
Device Drivers →
<*> Rockchip IO Voltage Domain supportRK3588 多个 IO 电压域通过设备树
pmu_io_domains配置,编译内核时需启用对应支持。
6. 内核裁剪(减小体积)
6.1 裁剪策略
| 策略 | 操作 | 预期减小 |
|---|---|---|
| 关闭调试选项 | 关闭 CONFIG_DEBUG_KERNEL 等 | ~2-5MB |
| 移除不用的驱动 | 关闭未用的网卡、声卡、摄像头驱动 | ~1-3MB |
| 使用模块化 | 不常用驱动编译为模块(=m) | 减小内核镜像 |
| 关闭文件系统支持 | 只留需要的 ext4 等 | ~0.5-1MB |
| 关闭网络协议栈 | 如不需要网络,可整个裁剪 | ~1-2MB |
6.2 建议关闭的配置项
电脑端 编辑内核 .config(或 menuconfig 逐项取消):
# 调试选项(量产固件建议关闭)
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 # 如不需要显示(无头设备)6.3 使用配置片段
RK3588 SDK 支持配置片段文件:
电脑端:
# 查看 RK3588 SDK 自带的片段
ls buildroot/configs/rockchip/
# 包含: adbd.config audio.config base.config benchmark.config bt.config
# camera.config chromium.config debug.config display.config
# game.config gpu.config network.config ...构建时这些片段会自动合并到内核配置中。
7. 保存配置并编译
7.1 保存为最小配置
电脑端:
# 保存精简配置
make ARCH=arm64 savedefconfig
# 替换默认配置(注意:会覆盖原默认配置!)
cp defconfig arch/arm64/configs/rockchip_linux_defconfig
# 编译内核
cd <SDK_PATH>
./build.sh kernel7.2 Buildroot 场景
如果用 Buildroot 构建,内核配置直接由 Buildroot 管理:
电脑端:
# 在 Buildroot 配置内核
cd <SDK_PATH>
source envsetup.sh rockchip_rk3588
make linux-menuconfig
# 保存到 BR 默认配置
make linux-update-defconfig
# 编译
make7.3 对比编译配置和运行配置
电脑端 vs 开发板对比:
# 开发板:导出运行配置
zcat /proc/config.gz | gunzip > /tmp/running_config
# 电脑端:取出编译配置
cat <SDK_PATH>/kernel/.config > /tmp/build_config
# 对比
diff /tmp/build_config /tmp/running_config仅做参考。实际运行配置可能受 bootargs、initramfs、内核命令行影响。
8. Kconfig 语法参考
8.1 配置项定义
# 定义菜单项
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.
endmenu8.2 Makefile 条件编译
# CONFIG_ROCKCHIP_DRM_VOP=y 时编译 vop.o
obj-$(CONFIG_ROCKCHIP_DRM_VOP) += vop.o
# CONFIG_ROCKCHIP_WIFI=m 时编译为模块
obj-$(CONFIG_ROCKCHIP_WIFI) += rkwifi.o9. 故障排除
9.1 menuconfig 显示乱码
现象: make menuconfig 界面显示乱码或无法正常显示。
解决方案:
电脑端:
sudo apt-get install libncurses5-dev
export LANG=en_US.UTF-89.2 内核编译后无法启动
现象: 内核崩溃(Kernel Panic)或无法挂载根文件系统。
解决方案:
- 确认保留了
CONFIG_EXT4_FS=y(根文件系统通常是 ext4) - 确认保留了
CONFIG_MMC_BLOCK=y(eMMC/SD 卡驱动) - 用原始
rockchip_linux_defconfig重新编译,逐步裁剪定位问题
9.3 模块加载失败
现象: modprobe 提示 Module XXX not found 或 Invalid module format。
解决方案:
开发板:
modinfo <module>.ko # 查看模块信息(路径、vermagic)
uname -r # 查看当前内核版本
# 重新编译与内核版本完全匹配的模块模块的
vermagic字段必须与运行内核一致,否则拒绝加载。
相关文档
- 01_Linux_SDK编译 — SDK 编译流程
- 03_设备树详解与实践 — 设备树配置
- 05_hardware-reference/00_硬件事实基线 — 硬件事实清单
