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

Lin*_*ner 4 c linux linux-kernel

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

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

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

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

mis*_*mer 5

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

module1.c(编译为 module1.ko)

int my_exported_variable;

EXPORT_SYMBOL(my_exported_variable);

// The rest of module1.c
Run Code Online (Sandbox Code Playgroud)

然后在 module2.c 中(编译成 module2.ko,必须在 module1.ko 之后进行 insmod 编辑)

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
Run Code Online (Sandbox Code Playgroud)

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