简要说明使用方法:

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。
在模块mod1中,EXPORT_SYMBOL(func1);
在模块mod2中,extern int func1();
就可以在mod2中调用func1了。

同理EXPORT_SYMBOL_GPL使用相同。

1、EXPORT_SYMBOL的作用是什么?

EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。
这里要和System.map做一下对比:
System.map 中的是连接时的函数地址。连接完成以后,在2.6内核运行过程中,是不知道哪个符号在哪个地址的。
EXPORT_SYMBOL的符号,是把这些符号和对应的地址保存起来,在内核运行的过程中,可以找到这些符号对应的地址。而模块在加载过程中,其本质就是能动态连接到内核,
如果在模块中引用了内核或其它模块的符号,就要EXPORT_SYMBOL这些符号,这样才能找到对应的地址连接。

2、使用方法

第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名);
第二、在调用该函数的模块中使用extern对之声明;
第三、首先加载定义该函数的模块,再加载调用该函数的模块;

3、区别

EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);
这两个宏均用于将给定的符号导出到模块外, _GPL版本的宏定义只能使符号对GPL许可的模块可用。 符号必须在模块文件的全局部分导出,不能在函数中导出,
这是因为上述这两个宏将被扩展成一个特殊用途的声明,而该变量必须是全局的。这个变量存储于模块的一个特殊的可执行部分(一个"ELF段" ),在装载时,内核通过这个段来寻找模块导出的变量
(感兴趣的读者可以看<linux/module.h>获知更详细的信息)。

EXPORT_SYMBOL举例说明

1、函数方面的使用:

例如我下面的例子,在一个驱动中drivers/video/lt9211/lt9211.c定义了函数lt9211_mipitolvds_init,然后在另外的.c文件中可以直接extern来使用:

 943 void lt9211_mipitolvds_init(void)944 {945         lt9211_config();946947         lt9211_timingset();948         if( pvideo_format != NULL )949         {950         lt9211_desscpll();951         lt9211_mipipcr();952953         //Tx config954         lt9211_txphy();955         lt9211_txdigital();956         lt9211_txpll();957 #ifdef LT9211_VEDIO_CHECK_DEBUG958         lt9211_videocheckdebug();959 #endif960961 #ifdef LT9211_BT_SET962         lt9211_BT_set();963 #endif964         }965966     mdelay(50);967 }968 EXPORT_SYMBOL(lt9211_mipitolvds_init);

直接exterm来使用:

  43 extern void lt9211_mipitolvds_init(void); //首先从其他地方extern过来
...635 static int panel_simple_enable(struct drm_panel *panel)636 {637         struct panel_simple *p = to_panel_simple(panel);638639         if (p->enabled)640                 return 0;641642         /* add for lt9211 resume/suspend init */643         lt9211_mipitolvds_init();  //这里是对函数的调用644645         if (p->desc && p->desc->delay.enable)646                 panel_simple_sleep(p->desc->delay.enable);647648         backlight_enable(p->backlight);649650         p->enabled = true;651652         return 0;653 }
2、变量方面的使用

首先在一个.c文件中定义:

int gyro_lsm9ds1_x = 0;
EXPORT_SYMBOL(gyro_lsm9ds1_x);

然后在另外的.c中extern过来使用:

extern int gyro_lsm9ds1_x;

Linux的EXPORT_SYMBOL和EXPORT_SYMBOL_GPL的使用和区别相关推荐

  1. linux中export和source的作用和区别

    linux中export和source的作用和区别 2013-11-12 12:36 1039人阅读 评论(0) 收藏 举报 分类: linux(82) shell与export命令 用户登录到Lin ...

  2. linux内存管理之RSS和VSZ的区别

    [译] linux内存管理之RSS和VSZ的区别 阅读 724 收藏 0 2019-08-25 原文链接: pengrl.com RSS是Resident Set Size(常驻内存大小)的缩写,用于 ...

  3. linux中cat、more、less命令区别详解

    linux中cat.more.less命令区别详解 转自:https://blog.csdn.net/xyw_blog/article/details/16861681 众所周知linux中命令cat ...

  4. linux源码包与RPM包的区别

    linux源码包与RPM包的区别 1.区别 .安装之前的区别:概念上的区别 比如说:源码包是开源的,比RPM包安装更自由,但是它安装更慢,更容易报错:RPM包是经过编译的,不能看到源代码,但是它安装更 ...

  5. linux命令grep和find怎么用,Linux下find和grep常用命令及区别介绍

    在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区别的. 区别: (1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空 ...

  6. Linux下useradd命令与adduser命令的区别(adduser更适合初级使用者,useradd比较适合有些高阶经验的使用者)

    文章目录 Linux下useradd命令与adduser命令的区别 man useradd man adduser Linux下useradd命令与adduser命令的区别 Linux下创建用户时会用 ...

  7. Linux中kil命令和pkill命令的区别

    Linux中kil命令和pkill命令的区别 kill命令格式: kill [参数][目标程序的端口号] 所以使用kill命令前需要使用ps命令查看目标程序的端口号: ps -ef | grep fi ...

  8. linux条件变量使用和与信号量的区别

    linux条件变量使用和与信号量的区别 今天在学习进程同步机制的时候看见一句话: 条件变量只能在管程中通过两个原语操作--wait原语和signal原语 于是发出了一个疑问:信号量机制和条件变量同步机 ...

  9. Linux下的CST和UTC时间的区别

    在linux中,用date查看时间的时候显示: 2008年 12月 17日 星期三 09:04:14 CST CST China Standard Time UTC+8:00 中国沿海时间(北京时间) ...

  10. linux中cat more less head tail 命令区别

    1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如: [root@localhost ~]# c ...

最新文章

  1. 学习笔记-express路径问题
  2. 怎么用php制作会员注册表单,帝国CMS前台会员登陆表单的制作教程
  3. SAP系统和微信集成的系列教程之七:使用Redis存储微信用户和公众号的对话记录
  4. java url 授权_Java:如何使用UrlConnection发布请求与授权?
  5. linux内核开源不能仿照_Linux内核开发,开源生产力工具,使用Google应用程序创建自动日历等
  6. 加入域时出现以下错误:找不到网络路径
  7. [Luogu P2801]教主的魔法
  8. mysql execute 存储过程_Mysql存储过程调用
  9. LayaBox---Animation---时间轴动画
  10. 英语报纸计算机类,报纸和电脑英语作文
  11. MATLAB图形句柄
  12. OC试题 ——通讯录(AddressBook)
  13. noip2012 pj错题整理
  14. 什么是web移动端-移动端布局特点
  15. Java Double equals()方法具有什么功能呢?
  16. Hadoop LZO压缩配置
  17. 2019年 十款Mac上必备的实用软件列表
  18. 关于md文件插入视频链接的方法。(亲测可用)
  19. netca/dbca方框乱码的解决方法
  20. php扩展geoIP的使用

热门文章

  1. Python字符串处理的8招秘籍
  2. 信息抽取 | 72篇论文梳理:涉及NER、复杂关系、小样本、文档级、多模态、开放域抽取...
  3. 【赛尔AAAI2021】小样本学习下的多标签分类问题初探
  4. 【Pytorch】谈谈我在PyTorch踩过的12坑
  5. 本周论文推荐(10.26-11.1)
  6. 逼疯一个程序员有多简单?
  7. 统计学习方法读书笔记2-极大似然估计与梯度下降法
  8. MySQL必知必会(一)
  9. 奔跑吧,骏马!——跑步类动画设计动态分析
  10. MindManager中读图工具的使用