在内核中标记可加载的内核模块
这个问题是关于Linux内核4.10的。在内核中标记可加载的内核模块
加载一个彻头彻尾的树LKM导致内核打印警告:
module: loading out-of-tree module taints kernel.
这就提出了从该检查中module.c: if (!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),还是通过特定方式或其他方式构建模块?
简而言之,当且仅当该模块正在构建intree时,构建系统才会将“MODULE_INFO(intree, "Y");
”行添加到“模块名称 .mod.c”文件中。
有一种显而易见的方式,通过将该行添加到模块的常规“.c”文件中来欺骗系统,但我不确定为什么要这样做。
较长版本....
外部模块通常用一个类似的命令内置:
$ make M=`pwd` modules
或旧的语法:
$ make SUBDIRS=`pwd` modules
非的存在-empty M
或SUBDIRS
会导致内核的顶层“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”文件。
为什么要标记一个out-of-tree模块作为in-tree?所有这一切都将是恼人的内核开发者。 – duskwuff