Linux内核中的模块间通信

时间:2013-03-29 08:00:14

标签: linux kernel

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

如果我只是从第一个模块导出该函数并在第二个模块中使用它,则第二个模块依赖于该符号,并且在没有第一个模块的情况下无法加载。

其中一个解决方案是让用户脚本查看第一个模块中函数的/ proc / kallsym,如果它存在,脚本将其地址作为参数传递给第二个模块,然后生成指针出来的。但出于显而易见的原因,我不喜欢这种解决方案。

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

我认为如果模块B依赖于模块A,则在没有首先加载模块A的情况下,模块B无法成功加载。

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

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

答案 2 :(得分:1)

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