9

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

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

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

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

4

3 回答 3

7

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

于 2013-05-15T15:28:04.750 回答
1

I think if module B depends on module A, the module B can not be successfully loaded without module A is loaded first.

In fact, only after module A inserted first, the symbols which module B needed which exported from module A will appear in the /proc/kallsym file.

The solution to your situation: in module B, module_init() function should have some codes to check the module A is already there or not, if not, load A first. i.e. Using request_module() to load A, or create a more fancy method to using try_then_request_module().

于 2013-03-29T08:22:19.680 回答
1

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

于 2015-01-09T18:12:19.347 回答