内核中两个模块,一个A,一个B,A模块中有操作函数,B模块要调用A模块的函数。
这是一个驱动工程师经常遇到的一个问题,该问题其实是模块符号导出问题,实现该功能比较简单,借助EXPORT_SYMBOL()即可。
这里的符号主要指的是全局变量和函数,静态全局变量其实也可以被另外一个模块访问到。
↓ Linux内核采用的是以模块化形式管理内核代码。内核中的每个模块相互之间是相互独立的,也就是说A模块的全局变量和函数,B模块是无法直接访问的。
有些时候,我们写一些模块代码的时候,发现部分函数功能别人已经实现了,此时我们就想如果我们可以调用他们已经实现好的函数接口就好了。那如何才能做到这点呢?
就靠符号导出了,也就是说你可以把你实现的函数接口和全局变量导出,以供其他模块使用。
在Linux内核的世界里,如果一个模块已经以静态的方式编译进的内核,那么它导出的符号就会出现在全局的内核符号表中。
在Ubuntu 14.04系统中,Linux内核的全局符号表存放在以下文件:
- /usr/src/linux-headers-3.2.0-29-generic-pae/Module.symvers
如果打开这个文件,可以发现里面的内容就是:
- Addr------->符号名------>模块名------>导出符号的宏
Linux内核给我们提供了两个宏:
- EXPORT_SYMBOL(name);
- EXPORT_SYMBOL_GPL(name);
上面宏定义的任一个使得给定的符号在模块外可用;GPL版本的宏定义只能使符号对GPL许可的模块可用;符号必须在模块文件的全局部分输出,在任何函数之外,因为宏定义扩展成一个特殊用途的并被期望是全局存取的变量的声明。
模块A导出全局变量global_var和函数show两个符号供模块B使用。
- #include <linux/init.h>
- #include <linux/module.h>
- static int global_var = 100;
- static void show(void)
- {
- printk("show(): global_var =%d \n",global_var);
- }
- static int hello_init(void)
- {
- printk("module b :global_var=%d\n",global_var);
- return 0;
- }
- static void hello_exit(void)
- {
- printk("hello_exit \n");
- return;
- }EXPORT_SYMBOL(global_var);
- EXPORT_SYMBOL(show);
- MODULE_AUTHOR("yikoulinux");
- MODULE_LICENSE("GPL");
- module_init(hello_init);
- module_exit(hello_exit);
- #include <linux/init.h>
- #include <linux/module.h>
- extern int global_var;
- extern void show(void);
- static int hello_init(void)
- {
- printk("module a: global_var= %d\n",global_var);
- show();
- return 0;
- }
- static void hello_exit(void)
- {
- printk("hello_exit \n");
- return;
- }
- MODULE_AUTHOR("yikoulinux");
- MODULE_LICENSE("GPL");
- module_init(hello_init);
- module_exit(hello_exit);
调试步骤:
1.编译模块A,然后加载模块A,在模块A编译好后,在它的当前目录会看到一个Module.symvers文件,这里存放的就是我们模块A导出的符号。
2.将模块A编译生成的Module.symvers文件拷贝到模块B目录下,然后编译模块B,加载模块B。
3.通过dmesg查看模块打印的信息。打印信息如下:
由结果可知,我们在B模块中访问到了模块A的全局变量global_var以及函数show。
正则表达式: 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定...
组件—导航菜单 顶栏 el-menu :default-active="activeIndex" class="el-menu-de...
1.用基本的文字元素标记内容 先看显示效果: 对应HTML代码: XML/HTML Code 复制...
% function WriteToFile(FileName, Contents, Append) on error resume next if ...
之前做了一个淘宝客返利微信公众号,后来很多人提到过微信返利机器人,现在微信...
Yii2框架在目前而言,网络上好评不断,最主要的原因,不管是新的框架,还是回顾...
端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升...
前言 上次咱们学习了如何使用Go操作Mysql,并且实现了简单的增删改查。 但是相对...
本文转载自微信公众号「猿天地」,作者尹吉欢。转载本文请联系猿天地公众号。 当...
介绍# 响应压缩技术是目前Web开发领域中比较常用的技术,在带宽资源受限的情况下...