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模块将函数指针当做回调函数传给驱动,是想双方的函数调用通讯。

最新文章

  1. 通信原理实践(三)——FM调制
  2. 双等位基因(biallelic sites )和多等位基因(multiallelic sites)
  3. IOS定位服务的应用
  4. C语言 文件操作1--二进制文件与文本文件
  5. mapreduce运用
  6. objc_msgSend消息传递学习笔记 – 对象方法消息传递流程
  7. lucene解决全文检索word2003,word2007的办法
  8. poj 3623 Best Cow Line, Gold
  9. WebApi实现验证授权Token,WebApi生成文档等
  10. MySQL之sql文件的导入导出
  11. 理解 if __name__ == '__main__'
  12. SpringCloud学习6-如何创建一个服务消费者consumer
  13. 第二十天 模块 sys os os下path settings random shuit
  14. NIO小纪
  15. Deep Learning (中文版&英文版)
  16. 论文阅读 | Clustrophile 2: Guided Visual Clustering Analysis
  17. 牛客网试卷: 京东2019校招笔试Java开发工程师笔试题(1-)
  18. Citrus Engine简单Demo
  19. Html基本操作实例代码
  20. iOS-代码修改Info.plist文件

热门文章

  1. oracle批量更新
  2. Java 8 类型转换及改进
  3. hdu5389 Zero Escape DP+滚动数组 多校联合第八场
  4. Android:ExpandableListView使用
  5. 【翻译自mos文章】Oracle GoldenGate 怎么在源头的传输进程和目的端的server/collector进程之间分配 port?
  6. POJ3185 The Water Bowls 反转(开关)
  7. vim设置为indent折叠以后,每次打开文件时代码处于折叠状态,能改变吗?
  8. motion程序的移植和安装【转】
  9. Android+Jquery Mobile学习系列(1)-开发环境
  10. php study80端口被占用