目录
一、问题概述
hello,小伙伴们大家好,今天来分享一个大家搞Linux驱动开发经常遇到的问题,也是我个人经常常遇到的,哈哈~。在我们动态去加载.ko文件的时候,特别是自己写的.ko或者是其他平台移植过来的.ko,容易出先模块动态加载失败的情况,如下图:
insmod: can't insert '/config/modules/5.10/mi_isp.ko': unknown symbol in module or invalid parameter
insmod: can't insert '/config/modules/5.10/mi_nir.ko': unknown symbol in module or invalid parameter
insmod: can't insert '/config/modules/5.10/imx415_MIPI.ko': unknown symbol in module or invalid parameter
二、加载失败的原因
一般情况下模块加载失败的原因可以总结为以下几个:
1.板子上运行的内核的版本和编译.ko文件所用的内核版本不一致;
2.第二种情况可能是.ok的加载顺序问题,例如A.ko需要用到B.ko的一些前置符号量。这个时候如果我们没有先加载B.ko,那在加载A.ko的时候就可能会出错;
3.linux 内核模块中没有声明 MODULE_LICENSE。
三、解决方法
1.对于第一种,是我们使用的内核版本不一致导致,这个多出现在移植跨平台移植驱动或者使用一些以前就编译好的.ko文件。这种情况解决起来也比较简单,我们只需要用我们新的的内核去重新编译模块就好了。
在我们编译.ko的makefile文件中去指定新的内核即可。
KERN_DIR = /home/book/linux-5.10.61
2.第二中是模块存在依赖关系,这个时候我们装载的时候就要按照先后顺序。(博主遇到的就是这种情况)
可以先dmesg打印内核的信息进行查看
这里我们可以看到,在加载mi_isp.ko的时候,有很多前置符号量没有找到。
我们在kernel目录下执行grep -nr "DrvSensorI2cWrite"
可以找到 mi_sensor.ko这个模块。
这时候我们需要先加载mi_sensor.ko,后面的.ko就能加载成功啦。
3.MODULE_LICENSE(“GPL”),这是一个Linux内核模块当中定义的宏,表示该模块使用GPL(GNU General Public License)许可证。GPL是一自由软件许可证,要求开发者在发布其代码时必须开源代码,并且可以自由使用、负责、修改和分发该软件。在Linux内核中,使用该许可剋有保证内核的开源行性。
这种情况我们只需要在模块的源代码中添加以下代码即可:
MODULE_LICENSE("GPL");
好啦,本期分享就到这啦~