内核模块使用导出的符号,具体取决于加载的其他模块

Kernel module using exported symbols depending on which other module is loaded

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

我有一个模块 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?

非常感谢,非常感谢您的意见。

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

这也意味着您的模块将负责检查其操作所需的所有符号是否存在。它还需要为通过 try_module_get() 提供这些符号的模块手动增加 refcount,然后通过 module_put().

在模块退出时减少它