将可加载内核模块标记为in-tree

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),还是通过以特定方式或其他方式构建模块来完成的?

Ian*_*ott 7

简而言之,当且仅当模块正在构建时,构建系统才会将该行添加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)

存在非空MSUBDIRS导致内核的顶级"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"文件.