调IMC42686驱动时,遇到此问题,加载的树外模块污染了内核。
insmod driver_icm42686.ko
[ 21.047635] driver_icm42686: loading out-of-tree module taints kernel.
这种错误可以不用理会,但看见此提示,不解决它又觉得不适。
解决方法
因此驱动用到了设备树,编译驱动的linux内核与insmod模块的linux的内核设备树不相同导致的,把驱动使用当前linux设备树重新编译一下,可以解决。
如果以上方法不能解决,那就是另外一个问题了。
还有一个原因就是没有把此驱动模块加入到 Kconfig 树导致的,即 make menuconfig 的配置选项中没有此驱动。把驱动信息加入到Kconfig树中,普可以通过配置内核来决定哪些驱动需要加载,系统也就不会再报loading out-of-tree module taints kernel的错误了。
如何把动模块加入到 Kconfig 树,找个驱动目录,打开 Kconfig 文件仿照着写就行,需要修改的还有 Makefile 文件,同样照着添加。
在驱动代码最后添加一句 MODULE_INFO(intree, "Y"); ,以欺骗内核本模块为树内模块,带欺骗性的东西都不太好,所以最好不要这样搞。
/*
* 内核签名机制配置项:
*/
CONFIG_MODULE_SIG=y
表示开启了签名机制。
CONFIG_MODULE_SIG_FORCE=y
则模块必须有正确的签名才能正常使用。
CONFIG_MODULE_SIG_ALL=y
内核在编译的时候,会主动去给模块签名。
在网上看到还说与内核在编译的时候选择支持内核签名机制有关,于是搜索了我用的内核,发现这机制并没有开启。
.config:633:# CONFIG_MODULE_SIG is not set
不是这么回事!