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

内核SPI驱动模块加载报错:device_create符号版本不匹配(err -22)

解决SPI驱动模块加载时device_create符号版本不匹配问题

错误原因

disagrees about version of symbol device_create 本质是编译模块的内核头文件/源码版本与当前运行内核版本不兼容,加上内核默认开启CONFIG_MODVERSIONS进行符号版本校验,导致符号不匹配无法加载。

分步解决方案

1. 对齐编译环境与运行内核版本

这是最常见的解决方式:

  • 查看当前系统运行的内核版本:
    uname -r
    
  • 安装对应版本的内核头文件(以Debian系发行版为例):
    sudo apt install linux-headers-$(uname -r)
    
  • 修改模块Makefile,确保内核源码路径指向当前运行内核的头文件目录(通常为/lib/modules/$(uname -r)/build),然后重新编译模块。

2. 适配不同内核版本的device_create函数

Linux内核5.15及以后版本中,device_create被标记为过时,推荐使用device_create_with_groups。如果需要兼容多版本内核,可在代码中添加版本判断:

#include <linux/version.h> // 需要包含此头文件获取版本宏

// ... 原有代码 ...

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
    si446x_dev.device = device_create_with_groups(si446x_dev.class, NULL, si446x_dev.devid, NULL, NULL, SI446X_NAME);
#else
    si446x_dev.device = device_create(si446x_dev.class, NULL, si446x_dev.devid, NULL, SI446X_NAME);
#endif

重新编译后,模块会自动适配当前内核版本的函数,避免符号不匹配。

3. 临时禁用符号版本校验(仅调试用)

如果只是临时调试,可在模块Makefile中添加以下内容跳过版本校验:

EXTRA_CFLAGS += -DMODVERSIONS -include linux/modversions.h

注意:此方法不适合生产环境,会降低模块的兼容性和安全性。

补充说明

你能在/sys/class/spi_master/和/sys/bus/spi/devices/找到SPI设备,说明SPI总线与设备的注册流程正常,问题仅局限于字符设备节点创建的函数符号兼容性。

内容的提问来源于stack exchange,提问作者Guoxin Yang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:27:23