在挂载一个第三方提供的驱动的时候,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,这些符号就会在后面加一段校验字串。这样做的目的是避免模块不正确加载情况下,使得内核崩溃。