RockChip RK3568 Debian11下编译USB串口模块insmod报错求助
解决RK3568内核模块编译后insmod提示"Invalid module format"问题
问题背景
- RK3568系统未预装ch341、ftdi_sio这类USB串口转换器驱动
- 系统内核版本:
uname -r输出 4.19.232 - 已下载对应主线内核源码,将系统自带的config文件复制到源码目录
/home/linaro/linux,确认config包含:CONFIG_MODVERSIONS=y CONFIG_USB_SERIAL_CH341=m CONFIG_USB_SERIAL_FTDI_SIO=m - 执行以下命令编译模块,编译过程无报错:
make ARCH=arm64 oldconfig make ARCH=arm64 modules_prepare make ARCH=arm64 -C . M=drivers/usb/serial modules - 但执行
insmod加载模块时,提示Invalid module format;modinfo ftdi_sio.ko显示vermagic为4.19.232 SMP mod_unload modversions aarch64,Makefile中的版本信息也完全匹配内核版本。
排查与解决步骤
1. 核对运行内核与源码配置的一致性
RK3568的官方内核通常会在主线内核基础上添加厂商自定义补丁,直接用主线源码编译的模块大概率和系统运行内核不兼容:
- 导出系统当前内核的配置文件(如果系统支持):
zcat /proc/config.gz > /tmp/running_kernel_config - 对比导出的配置和你使用的源码目录
.config:diff /tmp/running_kernel_config /home/linaro/linux/.config - 若存在差异,直接用
/tmp/running_kernel_config替换源码目录的.config,重新执行编译命令。
2. 确保编译工具链与内核编译时的工具链一致
系统运行的内核是厂商用特定版本工具链编译的,你本地工具链版本不匹配会导致模块格式错误:
- 查看系统内核的编译工具链信息:
输出会包含cat /proc/versiongcc version xx.x.x的具体版本,确保你编译模块时使用的交叉编译工具链版本完全一致。 - 重新编译时指定正确的交叉编译前缀,比如厂商常用的
aarch64-linux-gnu-:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- oldconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_prepare make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C . M=drivers/usb/serial modules
3. 验证模块的实际架构是否匹配
即使指定了ARCH=arm64,仍可能因工具链配置错误导致模块架构不对:
- 用
file命令检查模块的架构信息:
正常输出应包含file /home/linaro/linux/drivers/usb/serial/ftdi_sio.koELF 64-bit LSB relocatable, ARM aarch64,如果显示x86或其他架构,说明工具链或ARCH参数未生效,需检查交叉编译工具链的安装和配置。
4. 检查modversions的符号CRC校验
开启CONFIG_MODVERSIONS=y后,内核和模块的符号CRC必须完全匹配,否则会触发格式错误:
- 查看运行内核中目标符号的CRC:
nm /proc/kallsyms | grep usb_serial_probe - 查看编译出的模块中对应符号的CRC:
如果两者CRC值不同,说明你用的主线源码和系统运行内核的符号定义有差异,必须使用RK3568厂商提供的对应版本内核源码,而非主线源码。nm /home/linaro/linux/drivers/usb/serial/ftdi_sio.ko | grep usb_serial_probe
5. 尝试用dkms自动适配编译(系统支持的话)
dkms会自动匹配当前内核的配置和工具链,减少手动配置的出错概率:
- 先安装dkms工具:
sudo apt install dkms - 把usb串口驱动的源码复制到dkms的源码目录:
sudo mkdir -p /usr/src/usb-serial-1.0 sudo cp -r /home/linaro/linux/drivers/usb/serial/* /usr/src/usb-serial-1.0/ - 执行dkms的编译安装流程:
sudo dkms add -m usb-serial -v 1.0 sudo dkms build -m usb-serial -v 1.0 sudo dkms install -m usb-serial -v 1.0
内容的提问来源于stack exchange,提问作者Razzupaltuff
相关产品推荐
相关产品推荐

