符号导出
这里的符号主要指的是全局变量和函数
linux内核采用的是以模块化形式管理内核代码。内核中的每个模块互相之间是相互独立的,也就是说A模块的全局变量和函数,B模块是无法访问的。
如果B模块想访问A模块中的符号该怎么办呢?
- 符号表
linux内核里面,它把所有的符号放到一个表里面,模块在编译的时候,它会去这个表里面去找这些对应的符号(函数,全局变量),表里面有很多这样的信息。
- Ubuntu
ubuntu中,linux内核的全局符号表在:
/usr/src/linux-headers-xxxx-generic/Moudle.symvers
- 某个单独编译的内核
在根目录下
模块A
static int global_var = 100;
static void show(void)
{
printk("show() global_var = %d\n,global_var");
}
EXPORT_SYMBOL(global_var);
EXPORT_SYMBOL(show);
模块B
extern int global_var;
extern void show(void);
static int hello_init(void)
{
show();
return 0;
}
module_init(hello_init);
步骤
- 编译A模块,在模块A编译好后,在它的当前目录会看到一个Module.symvers文件,这里存放的就是模块A导出的符号表;
- 将模块A编译生成的Module.symvers文件拷贝到模块B目录下,然后编译B模块;
- 先加载A模块,然后加载模块B;
- 通过dmesg命令查看模块打印信息。
注意:
- 加载:必须先加载模块A,再加载模块B;
- 卸载:必须先卸载模块B,在卸载模块A;