gpt4 book ai didi

linux - 内核模块 : extern only if a specific parameter is set

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:38 26 4
gpt4 key购买 nike

我想使用另一个内核模块中定义的函数。通常你这样做:

其他模块

void do_sth() {
/* ... */
}
EXPORT_SYMBOL(do_sth);

我的模块

extern void do_sth();

void some_function(void) {
/* ... */
do_sth();
/* ... */

}

在我的例子中,如果安装了 other_module 或者,如果为我的模块设置了特定参数,我只想使用函数 do_sth() (某事像 use_other_module=y)

问题是,当我将函数声明为 extern(全局)时,如果未安装或加载 other_module,则无法再加载该模块.

所以我的问题是:

  • 有没有办法确定符号是否在运行时导出?
  • 有没有办法在函数内部将符号全局定义为 extern?

最佳答案

根据 Ian Abbott 的评论,这是一种可能的解决方案:

my_module 中:

  1. 将函数声明为 extern,否则编译器会提示 symbol_get() 中的 do_sth

    extern void do_sth();
  2. 声明一个指针,稍后将指向另一个模块中的函数 do_sth

    void (*__do_sth)();
  3. 分配指针,递增使用计数器以便内核知道有人正在使用其他模块

    __do_sth = symbol_get(do_sth);
    if (__do_sth)
    __do_sth();
  4. 在移除模块时,或者在您不再需要其他模块时更早:减少使用计数器。否则将无法删除另一个模块,因为内核认为它仍在使用中

    if (__do_sth)
    symbol_put(do_sth);
  5. 此外,您必须确保其他模块以某种方式根据需要加载,我为此使用了 UDEV 规则。

关于linux - 内核模块 : extern only if a specific parameter is set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56167260/

26 4 0