静态插入linux内核模块
Posted
技术标签:
【中文标题】静态插入linux内核模块【英文标题】:Insert linux kernel module statically 【发布时间】:2011-11-13 07:24:08 【问题描述】:从源代码构建 Linux 内核时,可以决定某个功能是静态构建到内核中还是打包到模块中以通过 .config 动态插入。
另一方面,如果我有任何 3rd 方模块的源代码,例如打包的设备驱动程序,是否可以以编程方式将此代码静态集成到内核中?并且不从根文件系统加载内核模块?
【问题讨论】:
注意,从法律的角度来看,您不能静态链接专有模块。如果这样做,Linux 内核编译过程将产生致命错误(如果未定义许可证,则会警告您)。 【参考方案1】:当然,您只需要做一些修改,将外部模块移动到内核源代码树中,稍微调整 Makefiles/Kconfig 以使代码内置,然后构建您的内核映像。例如,假设您将模块源移动到drivers/blah
。然后你应该在drivers/Makefile
的末尾添加一行
obj-y += blah/
你应该确保 drivers/blah/Makefile
设置为构建你的模块,类似于
obj-y += mymodule.o
mymodule-objs := src.o other.o
等等,你的 Makefile 设置在哪里,但是它需要构建你正在处理的特定模块。 注意:你必须使用 mymodule-objs 的输出文件名而不是输入文件名!
【讨论】:
如果我以这种方式插入模块源代码,是否会导致内核内置的模块插入和删除依赖代码过时? 不确定我是否完全理解您的问题——无论如何,如果您将源代码添加到内核中,那么内核中内置的唯一额外代码就是您添加的模块源代码中的代码。因此,如果模块编写得当,你就不应该得到任何你不需要的东西。 我认为模块的源代码包含与其“模块性”相关的代码,例如关心正确插入和删除 insmod/rmmod 的代码。以及为模块命名或告知其对其他模块的依赖关系的代码。所以我的问题是,如果现在将代码静态插入到内核中,这些代码的剩余部分会不会有任何障碍? 不,没有这样的代码。您有一个 module_init 函数,但即使代码直接链接到内核中,您也需要初始化代码。有卸载处理代码,但如果模块编写正确,这些函数将被注释__exit
,因此不会链接到内核映像中。
因此,模块具有通过module_init(..)
和module_exit(...)
宏定义的生命周期处理程序,而静态链接的相同代码依赖于__init
注释,对吧?以上是关于静态插入linux内核模块的主要内容,如果未能解决你的问题,请参考以下文章