Linux内核之间的模块间通信

我有两个Linux内核模块,其中一个可能会为另一个提供一些function。 但是使用该function并不重要,即使第一个模块不存在,第二个模块也可能(也应该)工作。

如果我只是从第一个模块导出函数并在第二个模块中使用它,则第二个模块依赖于该符号,如果没有第一个模块,则不能加载。

其中一个解决scheme是让用户脚本查看第一个模块中的函数/ proc / kallsym,如果它存在,那么脚本将其地址作为parameter passing给第二个模块,然后使指针脱离它。 但我不喜欢这个解决scheme,原因很明显。

如果有更多的正确和优雅的解决scheme,将允许第二个模块去获取第一个模块中的某个符号的地址,但避免硬依赖?

最后,我找到了解决方案:内核有symbol_get()和symbol_put()这使我有机会查找另一个模块中的任意符号(当然,它需要导出),并防止模块卸载,而我使用符号。

我认为如果模块B依赖于模块A,则模块B不能被成功加载,而不首先加载模块A.

实际上,只有先插入模块A后,才能从模块A导出的模块B所需的符号出现在/ proc / kallsym文件中。

对你的情况的解决方案:在模块B中,module_init()函数应该有一些代码来检查模块A是否已经在那里,如果没有,先载入A. 即使用request_module()来加载A,或者使用try_then_request_module()创建一个更奇特的方法。

有更优雅的解决方案,但需要更改内核。 基本上,内核被增强以容纳模块注册。 当一个模块被加载并且想把自己暴露给其他模块时,他将用一个众所周知的int注册到内核中 – 这只是内核数组中存储对已注册模块的引用的索引。 现在,任何想要获得对另一个模块引用的模块都只需要内核对这个模块的一个新的引用 – 使用相同的,熟知的int。 这些新的引用必须是短命的(即你得到一个引用,但把它放回相同的上下文中)。 为了允许长时间的连接,你必须在两者之间建立一个协议,当任何一个模块卸载时,他/她知道如何通知另一个模块他将要离开。