【问题标题】:How can I share a global variable between two Linux kernel modules?如何在两个 Linux 内核模块之间共享一个全局变量?
【发布时间】:2015-07-03 02:00:13
【问题描述】:

我试图在 USB 连接和断开连接时收到通知。 所以我正在尝试实现信号。我在 debugfs 中创建了一个文件“file1”。然后我提供了一个简单的写文件操作。

在用户空间有一个用户空间应用程序,它将把它的PID写入debugfs的“file1”中。

在内核空间中,我可以使用上面提到的 write 方法获取传递的 PID。但我想在不同的内核模块中使用这个 PID。所以我尝试使用EXPORT_SYMBOL();,但是如果我不包含公共头文件,我会收到编译错误。如果我包含头文件,当我刷新图像时,我看到 PID 为“0”。

谁能告诉我,如果这是正确的方法?或者告诉我我哪里出错了。或者,当 PID 写入文件时,我可以在不同的内核模块中收到通知吗?如果有怎么办?

【问题讨论】:

  • 不太清楚你真正想要完成什么,但对我来说,你在这里做的事情听起来非常错误(或者至少尝试做)。但是,请提供更多信息和您目前拥有的相关代码以及问题出在哪里。

标签: c linux linux-kernel


【解决方案1】:

EXPORT_SYMBOL() 是正确的方法。我不太明白您所说的“如果我不包含通用头文件”是什么意思。听起来您将EXPORT_SYMBOL() 包含在共享头文件中,这不是您想要做的。您想要执行以下操作:

module1.c(编译成module1.ko)

int my_exported_variable;

EXPORT_SYMBOL(my_exported_variable);

// The rest of module1.c

然后在module2.c中(编译成module2.ko,必须在module1.ko之后insmod-ed)

extern int my_exported_variable; // Note the extern, it is declaring but not defining it, the definition is in module1

// The rest of module2.c

在您安装第一个模块后,您可以通过执行grep my_exported_variable /proc/kallsyms 来检查符号是否已导出,假设您的系统上有/proc/kallsyms。如果你在那里看不到你的变量,那么 module2.ko 的 insmod 将无法处理未解析的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多