如何在两个Linux内核模块之间共享全局变量?

时间:2015-07-03 02:00:13

标签: c linux linux-kernel

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

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

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

任何人都可以告诉我,如果这是正确的方法吗?或者告诉我哪里出错了。或者,当PID写入文件时,我可以在不同的内核模块中获得通知。如果是这样的话?

1 个答案:

答案 0 :(得分:3)

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之后进行修改)

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

在insmod第一个模块后,假设您的系统上有grep my_exported_variable /proc/kallsyms,您可以通过执行/proc/kallsyms检查是否导出了该符号。如果你没有在那里看到你的变量,那么module2.ko的insmod会失败到一个未解析的符号。