2017-03-22 190 views
5

这个问题是关于Linux内核4.10的。在内核中标记可加载的内核模块

加载一个彻头彻尾的树LKM导致内核打印警告:

module: loading out-of-tree module taints kernel.

这就提出了从该检查中module.cif (!get_modinfo(info, "intree")) {

阅读get_modinfo它煤层认为“intree “只是.ko文件中的魔术字livnig。

上随机LKM我在我的系统中找到运行readelf表明这一点:

readelf -a imon.ko | grep intree 161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1

而在一个简单的自定义程序hello_world LKM寻找intree不返回任何结果。

这是真的吗?

如何将某些模块标记为在树中?它是通过向模块添加一个宏来完成的(如MODULE_LICENCE),还是通过特定方式或其他方式构建模块?

+0

为什么要标记一个out-of-tree模块作为in-tree?所有这一切都将是恼人的内核开发者。 – duskwuff

回答

4

简而言之,当且仅当该模块正在构建intree时,构建系统才会将“MODULE_INFO(intree, "Y");”行添加到“模块名称 .mod.c”文件中。

有一种显而易见的方式,通过将该行添加到模块的常规“.c”文件中来欺骗系统,但我不确定为什么要这样做。

较长版本....

外部模块通常用一个类似的命令内置:

$ make M=`pwd` modules 

或旧的语法:

$ make SUBDIRS=`pwd` modules 

非的存在-empty MSUBDIRS会导致内核的顶层“Makefile”设置变量KBUILD_EXTMOD。它不会被设置为正常的内核版本。

对于模块构建的阶段2(当输出消息“Building modules,stage 2”时),运行“scripts/Makefile.modpost”makefile。当设置了KBUILD_EXTMOD时,它运行scripts/mod/modpost,并使用不同的选项。特别是,当设置了KBUILD_EXTMOD时,使用-I选项。

寻找在“脚本/ MOD/modpost.c”的源modpost,所述external_module变量具有0的初始值,但-I选项将其设置为1。功能add_intree_flag()被称为与该第二参数is_intree设置为​​。当且仅当is_intree参数为true时,add_intree_flag()函数将MODULE_INFO(intree, "Y");写入“模块名称 .mod.c”文件。

因此,intree模块和外部模块之间的区别在于“modulename .mod.c”文件中存在MODULE_INFO(intree, "Y");宏调用。这被编译为“模块名称.mod.o”,并与该模块的其他目标文件相链接以形成“模块名称.ko”文件。