int my_var; EXPORT_SYMBOL_GPL(my_var);这样可以在其他驱动文件调用my_var了吗
时间: 2023-08-07 19:04:42 浏览: 48
使用 `EXPORT_SYMBOL_GPL` 导出的变量符号,可以在其他内核模块中使用。具体步骤如下:
1. 在某个 C 文件中定义变量,并使用 `EXPORT_SYMBOL_GPL` 宏定义导出该变量符号,例如:
```
// file1.c
int my_var = 0; // 定义变量 my_var
EXPORT_SYMBOL_GPL(my_var); // 导出变量 my_var
```
2. 为该 C 文件编译生成目标文件,例如:
```
gcc -c file1.c -o file1.o
```
3. 将生成的目标文件链接为一个库文件,例如:
```
ar rcs libmylib.a file1.o
```
4. 在其他驱动文件中使用该库文件,并使用 `extern` 关键字声明变量 `my_var`,例如:
```
// driver.c
#include <linux/module.h>
#include <linux/kernel.h>
#include "mylib.h" // 引用库头文件
extern int my_var; // 声明变量 my_var
int my_init(void)
{
printk(KERN_INFO "my_var = %d\n", my_var); // 输出变量 my_var 的值
return 0;
}
void my_exit(void)
{
printk(KERN_INFO "Goodbye\n");
}
module_init(my_init);
module_exit(my_exit);
```
```
// mylib.h
extern int my_var; // 声明变量 my_var
```
5. 为该驱动文件编译链接库文件,并生成内核模块,例如:
```
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
```
这里假设你的驱动代码位于当前目录下,使用 `make` 命令编译生成内核模块。
6. 加载该内核模块,并查看内核日志输出,例如:
```
insmod driver.ko
dmesg | tail
```
你应该可以看到类似如下的输出:
```
[ 7311.771679] my_var = 0
```
这样,变量 `my_var` 就可以在其他内核模块中共享了。需要注意的是,使用 `EXPORT_SYMBOL_GPL` 导出的符号只能在与内核相同的 GPL 许可证下使用。