小松之LINUX驱动学习笔记之模块间函数调用通讯
2024-10-19 03:25:43
1. 符号导出函数
EXPORT_SYMBOL()
EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。
EXPORT_SYMBOL_GPL()
EXPORT_SYMBOL_GPL和前面一个类似,但这个范围只适合GPL许可的模块进行调用。
2. 使用方法
加入B中调用A中导出函数
[1] 在模块A中c文件或者头文件中使用EXPORT_SYMBOL(xxxx) 导出函数.
有些需要添加编译选项 -DEXPORT_SYMTAB.
[2] 在模块B中用 "extern" 申明函数(如, extern int xxxx);
申明以后就能够直接使用导出的函数了。
另外:在导出函数以后,可以使用 cat proc/kallsyms来查看所有的导出符号,其中属性为t的标识是不能被调用的,所以如果导出符号是t类型,那么无法直接被其他模块使用。
无法导出问题解决
方法一: 在A模块编译好后会生成符号表文件Module_symvers,里面有函数地址和函数名对应关系,把这个文件拷贝到需要调用的B的源代码下,替换B的该文件。
然后重新编译B模块.这样就能够让B调用A的函数,以后加载模块顺序也必须先A后B,卸载相反。
方法二: 将两个模块放在一个目录下,进行编译。其实和方法一类似。
这样就能够成功的实现两个模块之间的函数调用,比如KVM如果需要和驱动模块相互调用,就能使用这个方法。如果是两个模块之间需要相互调用,可以让驱动模块函数导出,KVM模块将函数指针当做回调函数传给驱动,是想双方的函数调用通讯。
最新文章
- 通信原理实践(三)——FM调制
- 双等位基因(biallelic sites )和多等位基因(multiallelic sites)
- IOS定位服务的应用
- C语言 文件操作1--二进制文件与文本文件
- mapreduce运用
- objc_msgSend消息传递学习笔记 – 对象方法消息传递流程
- lucene解决全文检索word2003,word2007的办法
- poj 3623 Best Cow Line, Gold
- WebApi实现验证授权Token,WebApi生成文档等
- MySQL之sql文件的导入导出
- 理解 if __name__ == '__main__'
- SpringCloud学习6-如何创建一个服务消费者consumer
- 第二十天 模块 sys os os下path settings random shuit
- NIO小纪
- Deep Learning (中文版&;英文版)
- 论文阅读 | Clustrophile 2: Guided Visual Clustering Analysis
- 牛客网试卷: 京东2019校招笔试Java开发工程师笔试题(1-)
- Citrus Engine简单Demo
- Html基本操作实例代码
- iOS-代码修改Info.plist文件
热门文章
- oracle批量更新
- Java 8 类型转换及改进
- hdu5389 Zero Escape DP+滚动数组 多校联合第八场
- Android:ExpandableListView使用
- 【翻译自mos文章】Oracle GoldenGate 怎么在源头的传输进程和目的端的server/collector进程之间分配 port?
- POJ3185 The Water Bowls 反转(开关)
- vim设置为indent折叠以后,每次打开文件时代码处于折叠状态,能改变吗?
- motion程序的移植和安装【转】
- Android+Jquery Mobile学习系列(1)-开发环境
- php study80端口被占用