在挂载一个第三方提供的驱动的时候,insmod命令后出现错误信息:

GPL_***: version magic '2.6.31--LSDK-9.2.0_U6.616 mod_unload modversions MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U6.616 mod_unload MIPS32_R2 32BIT '

NetUSB: version magic '2.6.31--LSDK-9.2.0_U6.616 mod_unload modversions MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U6.616 mod_unload MIPS32_R2 32BIT '

按照提示信息,应该是挂载驱动和当前运行的kernel 版本不一样导致的,查看代码,发现是在:

include/linux/vermagic.h中定义:

/* Simply sanity version stamp for modules. */

#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif
#define VERMAGIC_STRING                         \
   UTS_RELEASE " "                            \
   MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             \
   MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS    \
   MODULE_ARCH_VERMAGIC

这里应该是CONFIG_MODVERSIONS这个定义差异导致的,第三方的驱动中编译驱动使用的SDK打开了这个宏,而我当前使用的kernel没有打开。

网上查找资料看看CONFIG_MODVERSIONS的作用,原因是linux 内核里面有很多export给其他模块使用的符号表;一般情况下,如果没有选择CONFIG_MODVERSIONS,这些符号是正常的字串;如果选择了CONFIG_MODVERSIONS,这些符号就会在后面加一段校验字串。这样做的目的是避免模块不正确加载情况下,使得内核崩溃。