Linux的EXPORT_SYMBOL和EXPORT_SYMBOL_GPL的使用和区别

Linux的EXPORT_SYMBOL和EXPORT_SYMBOL_GPL的使用和区别简要说明使用方法:一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。在模块mod1中,EXPORT_SYMBOL(func1);在模块mod2中,externintfunc1();就可以在mod2中调用func1了。同理EXPORT_SYMBOL_GPL使用相同。1、EXPORT_SYMBOL的作用是什么?EXPO…

大家好,又见面了,我是你们的朋友全栈君。

简要说明使用方法:

一个模块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();
 946
 947         lt9211_timingset();
 948         if( pvideo_format != NULL )
 949         { 
   
 950         lt9211_desscpll();
 951         lt9211_mipipcr();
 952
 953         //Tx config
 954         lt9211_txphy();
 955         lt9211_txdigital();
 956         lt9211_txpll();
 957 #ifdef LT9211_VEDIO_CHECK_DEBUG
 958         lt9211_videocheckdebug();
 959 #endif
 960
 961 #ifdef LT9211_BT_SET
 962         lt9211_BT_set();
 963 #endif
 964         }
 965
 966     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);
 638
 639         if (p->enabled)
 640                 return 0;
 641
 642         /* add for lt9211 resume/suspend init */
 643         lt9211_mipitolvds_init();  //这里是对函数的调用
 644
 645         if (p->desc && p->desc->delay.enable)
 646                 panel_simple_sleep(p->desc->delay.enable);
 647
 648         backlight_enable(p->backlight);
 649
 650         p->enabled = true;
 651
 652         return 0;
 653 }

2、变量方面的使用

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

int gyro_lsm9ds1_x = 0;
EXPORT_SYMBOL(gyro_lsm9ds1_x);

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

extern int gyro_lsm9ds1_x;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157935.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS es6的Class类详解

    JS es6的Class类详解文章目录JSes6的Class类详解class基本语法Class的基本语法之constructorClass的基本语法之类的调用方式Class的基本语法之getter和setterClass的基本语法之类的属性名Class的基本语法的特别注意点Class的静态属性和方法Class的私有方法和私有属性构造函数的新属性构造函数的新属性JSes6的Class类详解class基本语法JavaScript语言中,生成实例对象的传统方法是通过构造函数和原型的组合模式.ES6提供了更接近传统语言(java)

    2022年6月10日
    37
  • 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第三章 2020-12-25

    小白能读懂的 《手把手教你学DSP(TMS320X281X)》第三章 2020-12-251最小系统1.1任何保证正常工作一定要检查电源和地是否短接。电源芯片一定要产生稳定电压,3.3V和1.8V。板子要断电插拔,不要热插拔JTAG。1.2最小系统1.2.1电源电路电源芯片常用TPS767D301,产生稳定的3.3V与1.8V。电源和地之间要通过电容连接,电容值查询数据手册,有推荐使用的电路。数字电源和模拟电源通过电感或磁珠连接,数字地和模拟地也通过这些隔断。1.2.2芯片引脚主要是各部分的引脚,内核数字地和模拟地,内核电压和模拟电压。

    2022年5月4日
    51
  • 国外迅雷下载太慢怎么办_迅雷下载宝还能用吗

    国外迅雷下载太慢怎么办_迅雷下载宝还能用吗复制下载链接,用百度网盘离线下载到网盘内,然后从网盘直接下载,速度相当给力

    2022年9月7日
    1
  • C++写一个CSGO开箱模拟器「建议收藏」

    C++写一个CSGO开箱模拟器「建议收藏」head玩过csgo的人类都知道,开箱是很有趣的。————名人名言Appstore上有专门的开箱模拟器,但是啊,他有广告。(;′⌒`)所以心善的博主决定自己用C++手撸一款开箱模拟器:3A大作,有整整一种箱子可供选择附加开箱动画,效果及其逼真…

    2022年9月28日
    0
  • 【MyBatis学习13】MyBatis中的二级缓存[通俗易懂]

    【MyBatis学习13】MyBatis中的二级缓存[通俗易懂]1.二级缓存的原理  前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的。为了更加清楚的描述二级缓存,先来看一个示意图:  从图中可以看出:sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到该UserMapper的二级缓存中。

    2022年9月15日
    0
  • snmptrap怎么发送_cmd运行nmap

    snmptrap怎么发送_cmd运行nmapSNMP简单网络管理协议,其中其支持的一个命令snmptrap命令,用于模拟向管理机发送trap消息。启动陷阱方法:snmptrapd-C-c/etc/snmp/snmptrapd.conf-Lf/var/log/net-snmptrap.log例如:snmptrap-v1-cpublic192.168.2.124.1.3.6.1.4.1.1192.168.2.12561…

    2022年8月20日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号