在Linux中静态地插入内核模块

15

在从源代码构建Linux内核时,可以通过.config决定某个功能是静态构建到内核中还是打包成模块以便动态插入。

但如果我有任何第三方模块的源代码,例如打包的设备驱动程序,是否可能将此代码静态地集成到内核中?而不是从根文件系统加载内核模块?


请注意,从法律角度来看,您不能静态链接专有模块。如果这样做,Linux内核编译过程将会产生致命错误(并在许可证未定义时发出警告)。 - Jérôme Pouiller
1个回答

13

当然可以,你只需要进行一些调整,将外部模块移动到内核源代码树中,微调Makefile/Kconfig以便代码被内置,并构建内核映像。例如,假设你将模块源代码移动到drivers/blah中,则应在drivers/Makefile末尾添加一行:

obj-y += blah/

你需要确保 drivers/blah/Makefile 已经设置用于构建你的模块,例如:

obj-y += mymodule.o
mymodule-objs := src.o other.o

等等,你的Makefile必须按照构建你正在处理的特定模块的方式进行设置。 注意:你必须使用mymodule-objs的输出文件名而不是输入文件名!


如果我通过这种方式插入模块源代码,是否会导致内核中构建过时的模块插入和删除依赖代码? - dronus
我不确定我完全理解你的问题--无论如何,如果你将源代码添加到内核中,那么内核中唯一额外构建的代码就是你添加的模块源代码。因此,如果模块编写正确,你不应该得到任何你不需要的东西。 - Roland
1
我认为一个模块的源代码包含与其“模块性”相关的代码,例如关心使用insmod/rmmod进行适当插入和删除的代码。以及给模块命名或告知其对其他模块的依赖关系的代码。因此,我的问题是,如果该代码现在静态地插入到内核中,那么这样的代码遗留下来会有任何障碍吗? - dronus
没有这样的代码。你有一个module_init函数,但即使代码直接链接到内核中,你仍需要初始化代码。有卸载处理代码,但如果模块编写正确,那些函数将被注释为 __exit,因此不会链接到内核映像中。 - Roland
因此,通过module_init(...)module_exit(...)宏定义,模块具有生命周期处理程序,而同一代码静态链接则依赖于__init注释,对吧? - dronus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接