Mr *_* M. 7 linux kernel kernel-module linux-kernel
这个问题是关于linux内核4.10的.
加载树外LKM会导致内核打印警告:
module: loading out-of-tree module taints kernel.
这可以从这个check.c模块中得出:
if (!get_modinfo(info, "intree")) {
阅读get_modinfo它的接缝"intree"只是.ko文件中的魔法字符串livnig .
readelf在我的系统中找到的随机LKM上运行显示:
readelf -a imon.ko | grep intree
161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1
在寻找intree简单的自定义hello_world时,LKM不会返回任何结果.
实际情况如此吗?
如何将某些模块标记为树内?是通过向模块添加宏(如MODULE_LICENCE),还是通过以特定方式或其他方式构建模块来完成的?
简而言之,当且仅当模块正在构建时,构建系统才会将该行添加MODULE_INFO(intree, "Y");到" modulename .mod.c"文件中.
有一种明显的方法可以通过将该行添加到模块的常规".c"文件中来欺骗系统,但我不确定您为什么要这样做.
更长的版本....
外部模块通常使用与此类似的命令构建:
$ make M=`pwd` modules
Run Code Online (Sandbox Code Playgroud)
或旧的语法:
$ make SUBDIRS=`pwd` modules
Run Code Online (Sandbox Code Playgroud)
存在非空M或SUBDIRS导致内核的顶级"Makefile"设置KBUILD_EXTMOD变量.它不会被设置为正常的内核构建.
对于模块构建的第2阶段(当输出消息"构建模块,第2阶段"时),make运行"scripts/Makefile.modpost"makefile.设置scripts/mod/modpost时,它会以不同的选项运行KBUILD_EXTMOD.特别是,设置-I时使用该选项KBUILD_EXTMOD.
查看modpost"scripts/mod/modpost.c" 中的源代码,该external_module变量的初始值为0,但该-I选项将其设置为1. add_intree_flag()调用该函数时将第二个参数is_intree设置为!external_module.当且仅当其参数为true时,该add_intree_flag()函数才会写入MODULE_INFO(intree, "Y");" modulename .mod.c"文件is_intree.
因此,intree模块和外部模块之间的区别在于MODULE_INFO(intree, "Y");" modulename .mod.c"文件中存在宏调用.这将被编译为" modulename .mod.o"并与模块的其他目标文件链接以形成" modulename .ko"文件.