【问题标题】:Kernel module using exported symbols depending on which other module is loaded内核模块使用导出的符号,具体取决于加载的其他模块
【发布时间】:2020-07-03 02:37:06
【问题描述】:

根据定义,如果所需的符号不存在,模块将不会加载(或抱怨)。 我想问一下是否有办法以某种方式克服以下情况:

我有模块 X,它使用模块 Y1 或 Y2 中的符号。在同一时间只加载 Y1 或 Y2 中的一个。就像,对于一个系统配置,我会加载 Y1,对于其他 Y2。 问题是,X 不会加载,因为它会抱怨其他(未加载的)Y 驱动程序缺少符号。

示例: Y1导出符号:EXPORT_SYMBOL_GPL(y1); Y2 导出符号:EXPORT_SYMBOL_GPL(y2);

X 会这样做:

if (config1)
   y1(); // Available only when Y1 is loaded.
else
   y2(); // Available only when Y2 is loaded.

在启动时,根据配置仅加载 Y1 或 Y2 之一。这一切都可以编译,但是在 config1 中加载 X 时会说:

Unknown symbol y2

有没有人知道这是否可以通过某种方式解决? 或者我只需要根据配置构建两个 X 模块 X1 和 X2?

非常感谢,非常感谢您的 cmets。

【问题讨论】:

    标签: c linux-kernel


    【解决方案1】:

    您可以通过不直接使用导出的符号来实现此目的,而是使用kallsyms_lookup_name() 在运行时中查找它们。这样,您的模块 X 将不会显式依赖模块 Y1 和 Y2 导出的符号,因此即使其中一个(或什至两个)模块未加载,它也能够加载。

    这也意味着您的模块将负责检查其操作所需的所有符号是否存在。它还需要手动增加通过try_module_get() 提供这些符号的模块的引用计数,然后通过module_put() 在模块退出时减少它。

    【讨论】:

    • 这正是我所需要的。非常感谢罗伯特。
    猜你喜欢
    • 2012-02-26
    • 2020-09-30
    • 2011-02-12
    • 2012-03-18
    • 2014-03-01
    • 2019-06-16
    • 2019-03-14
    • 2012-08-06
    • 2018-12-24
    相关资源
    最近更新 更多