一、查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义。

二、那么EXPORT_SYMBOL的作用是什么?
           EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。

三、使用方法
         1、在模块函数定义之后使用“EXPORT_SYMBOL(函数名)”来声明。
         2、在调用该函数的另外一个模块中使用extern对之声明。
         3、先加载定义该函数的模块,然后再加载调用该函数的模块,请注意这个先后顺序。

四、实例测试。

1、测试思路:在模块export_symbol_one中定义一个函数function_one(void);在另外一个模块export_symbol_two中定义一个函数function_two(void),function_two(void)里面会调用function_one(void)。

2、测试代码:

export_symbol_one.c

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
 
static int function_one(void)
{
        printk("EXPORT_SYMBOL  In Func: %s...\n",__func__);
        return 0;
}
 
EXPORT_SYMBOL(function_one);
 
static int __init export_symbol_init(void)
{
        printk("EXPORT_SYMBOL  Module one,Init!\n");
        return 0;
}
 
static void __exit export_symbol_exit(void)
{
        printk("EXPORT_SYMBOL  Module one,Exit!\n");
}
 
module_init(export_symbol_init);
module_exit(export_symbol_exit);
Makefile:

obj-m += export_symbol_one.o 
 
KDIR := /home/weifanghai/Android_4.4_git/xunwei/kernel/iTop4412_Kernel_3.0
PWD ?= $(shell pwd)
 
 
all:
    make -C $(KDIR) M=$(PWD) modules
        
clean:
    rm -rf *.o

export_symbol_two.c

#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
 
static int function_two(void)
{
        extern int function_one(void);
        function_one();
        printk("EXPORT_SYMBOL In Func: %s...\n",__func__);
        return 0;
}
 
static int __init export_symbol_init(void)
{
        printk("EXPORT_SYMBOL  Module two,Init!\n");
        function_two();
        return 0;
}
 
static void __exit export_symbol_exit(void)
{
        printk("EXPORT_SYMBOL  Module two,Exit!\n");
}
 
module_init(export_symbol_init);
module_exit(export_symbol_exit);

Makefile
obj-m += export_symbol_two.o 
 
KDIR := /home/weifanghai/Android_4.4_git/xunwei/kernel/iTop4412_Kernel_3.0
PWD ?= $(shell pwd)
 
 
all:
    make -C $(KDIR) M=$(PWD) modules
        
clean:
    rm -rf *.o

3、依次加载两个模块:
          [root@iTOP-4412]# insmod export_symbol_one.ko

[root@iTOP-4412]# insmod export_symbol_two.ko

4、运行结果效果图:

5、小结:从上面的打印信息看,模块export_symbol_two.ko里面的函数function_two(void)可以调用模块export_symbol_one.ko里面的函数function_one(void)。
--------------------- 
作者:海月汐辰 
来源:CSDN 
原文:https://blog.csdn.net/qq_37858386/article/details/78444168

Linux驱动编程中EXPORT_SYMBOL()介绍相关推荐

  1. Linux驱动编程 step-by-step

    第三次看了LDD3了(虽然现在已经是kernel3.0但从这本书商还是能学到很多) 每次都有一些收获 现在终于能够写一写代码了 驱动程序的作用: 简单来说 驱动程序就是使计算机与设备通信的特殊的代码, ...

  2. Linux驱动调试中的Debugfs的使用简介

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  3. Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  4. Linux驱动编程 step-by-step (二) 简单字符设备驱动

    简单字符设备驱动 1.主次设备号 主设备号标识设备连接的的驱动,此设备好由内核使用,标识在相应驱动下得对应的设备 在linux中设备号是一个32位的dev_t类型 typedef __u32    _ ...

  5. Linux驱动编程 step-by-step (二)

    简单字符设备驱动 1.主次设备号 主设备号标识设备连接的的驱动,此设备好由内核使用,标识在相应驱动下得对应的设备 在linux中设备号是一个32位的dev_t类型 typedef __u32    _ ...

  6. 在Linux C编程中使用Unicode和UTF-8

    在Linux C编程中使用Unicode和UTF-8 目前各种Linux发行版都支持UTF-8编码,当前系统的语言和字符编码设置保存在一些环境变量中,可以通过locale命令查看: $ locale ...

  7. Linux驱动编程视频教程

    本视频教程主要介绍字符驱动.杂项设备.中断.调试驱动的基本方法以及驱动的移植等. Linux驱动编程视频教程: 链接:https://pan.baidu.com/s/1Yn5d4w9uudb4tGDT ...

  8. linux驱动编程——ch340x驱动移植

    Linux驱动编程--ch340x驱动移植 主要概念: ​ ch340x驱动移植 ​ 作为通用器件,厂商都有提供适配各种平台的驱动.linux一般会提供驱动源码. ​ 一般所谓驱动移植,就是将厂商的驱 ...

  9. LINUX驱动模型中bus与platform_bus区别和异同

     LINUX驱动模型中bus与platform_bus区别和异同 首先要明确的是platform_bus是BUS的一个字集,也就是说platform_bus是BUS定义的一个总线类型.可以看到pl ...

最新文章

  1. linux查看服务依赖关系,服务管理(1)
  2. 微软出资10亿美元研究AGI,意与谷歌竞争?
  3. 解决ubuntu(16.04版本)和windows电脑之间无法复制粘贴问题
  4. 200 计算机网络之物理层思维导图小结
  5. pca图解读_干货!手把手一步一步解读PCA分析,逃学博士尽力了!
  6. 使用字符串切割,使手机号中间四位隐藏
  7. 无法使用此数据源,因为没有正确配置performancepoint services
  8. CFS调度器(1)-基本原理
  9. LaTeX数学符号表
  10. 口袋小精灵JAVA版下载_口袋小精灵200合一
  11. Matlab:i 和j其实是MATLAB内置函数(built-in function)
  12. 余世雄 - 与上司沟通的7个技巧
  13. 基于80C51单片机——中断小结
  14. 移动路由器做网站服务器,移动路由器上网方式选哪个?
  15. 项目依赖aar 以及 依赖嵌套aar
  16. Docker Swarm 维护模式
  17. 微软应用商店打不开代码: 0x80131500
  18. springBoot启动失败Caused by: java.lang.ClassNotFoundException: org.springframework.http.MediaType
  19. c语言 编程结束怎么表示,c语言开头(c语言编程开头和结束代码)
  20. 数据屏蔽:静态与动态

热门文章

  1. 访问 IIS 元数据库失败解决问题的方法
  2. 《基于Node.js实现简易聊天室系列之项目前期工作》
  3. 2015-2016 ACM-ICPC Southwestern Europe Regional Contest (SWERC 15)
  4. tensorflow 之 tf.reshape 之 -1
  5. 考考大家的数学,计算以下计算公式的结果
  6. 关于sizeof表达式作为数组元素个数的编译
  7. 前端面试题整理(js)
  8. 玩转SmartQQ之登录
  9. sh里的变量 $0 $1 $$ $#
  10. WINCE6.0添加对viewrs(PDF,Word,Execel和PowerPoint)支持