You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/version
    
    输出会包含gcc 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.ko
    
    正常输出应包含ELF 64-bit LSB relocatable, ARM aarch64,如果显示x86或其他架构,说明工具链或ARCH参数未生效,需检查交叉编译工具链的安装和配置。

4. 检查modversions的符号CRC校验

开启CONFIG_MODVERSIONS=y后,内核和模块的符号CRC必须完全匹配,否则会触发格式错误:

  • 查看运行内核中目标符号的CRC:
    nm /proc/kallsyms | grep usb_serial_probe
    
  • 查看编译出的模块中对应符号的CRC:
    nm /home/linaro/linux/drivers/usb/serial/ftdi_sio.ko | grep usb_serial_probe
    
    如果两者CRC值不同,说明你用的主线源码和系统运行内核的符号定义有差异,必须使用RK3568厂商提供的对应版本内核源码,而非主线源码。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:03:21