内核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
相关产品推荐
相关产品推荐

