内核模块使用导出的符号,具体取决于加载的其他模块
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()
.
在模块退出时减少它
根据定义,如果所需符号不存在,模块将不会加载(或抱怨)。 我想请问是否有办法以某种方式克服以下情况:
我有一个模块 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()
.