如何在两个 Linux 内核模块之间共享一个全局变量?
How can I share a global variable between two Linux kernel modules?
我正在尝试在 USB 连接和断开连接时收到通知。
所以我正在尝试实现信号。我在 debugfs 中创建了一个文件 "file1"。然后我提供了一个简单的写文件操作。
在用户space中有一个用户space的应用程序,它会把它的PID写在debugfs的"file1"中。
在内核中space我可以使用上面提到的写入方法获取传递的PID。但是我想在不同的内核模块中使用这个 PID。所以我尝试使用EXPORT_SYMBOL();
,但是如果我不包含公共头文件,我会得到一个编译错误。如果我包含头文件,当我刷新图像时,我看到 PID 是“0”。
谁能告诉我,这是否正确?或者告诉我哪里出错了。或者,当 PID 写入文件时,我可以在不同的内核模块中得到通知吗?如果有怎么办?
EXPORT_SYMBOL()
是正确的做法。我不太明白你所说的 "if I don't include the common header file" 是什么意思。听起来您将 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)
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 将无法处理未解析的符号。
我正在尝试在 USB 连接和断开连接时收到通知。 所以我正在尝试实现信号。我在 debugfs 中创建了一个文件 "file1"。然后我提供了一个简单的写文件操作。
在用户space中有一个用户space的应用程序,它会把它的PID写在debugfs的"file1"中。
在内核中space我可以使用上面提到的写入方法获取传递的PID。但是我想在不同的内核模块中使用这个 PID。所以我尝试使用EXPORT_SYMBOL();
,但是如果我不包含公共头文件,我会得到一个编译错误。如果我包含头文件,当我刷新图像时,我看到 PID 是“0”。
谁能告诉我,这是否正确?或者告诉我哪里出错了。或者,当 PID 写入文件时,我可以在不同的内核模块中得到通知吗?如果有怎么办?
EXPORT_SYMBOL()
是正确的做法。我不太明白你所说的 "if I don't include the common header file" 是什么意思。听起来您将 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)
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 将无法处理未解析的符号。