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

标签 linux linux-kernel linux-device-driver

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

其他模块

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/

相关文章:

linux - 亚马逊 ec2 上的 NRPE 远程主机设置

linux - Sugar CRM 模块安装问题

android - 为什么要用-fno-pic 编译Android 内核模块?

linux - 如果普通程序和驱动程序都使用系统调用,那么设备驱动程序还有什么意义呢?

c - 使用/将Linux shell命令 "echo 1=200 >/dev/mydevice"转换为c程序

linux - Bash 忽略特定命令的错误

linux - 来自emacs的Ubuntu Linux python绘图,无法从 '_imaging'导入名称 'PIL'

c - Linux 内核何时会将 SIGSEGV 的信号处理程序重置为 SIG_DFL?

linux-kernel - wait_for_completion 与 wakeup_interruptible 有何不同

linux-kernel - 绕过 I/O 调度和 linux 内核页面缓冲