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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java安全之反序列化回显与内存马

    Java安全之反序列化回显与内存马0x00前言按照我个人的理解来说其实只要能拿到Request和Response对象即可进行回显的构造,当然这也是众多方式的一种。也是目前用的较多的方式。比如

    2021年12月13日
    56
  • 在线html代码生成器,支持网页快速排版 CSS代码一键生成的在线设计工具

    在线html代码生成器,支持网页快速排版 CSS代码一键生成的在线设计工具用户体验现在作为很多工作的重中之重,设计师们更要把用户体验放在第一位,如果你曾经尝试过想把你的板面调整到最适合阅读的状态,就会知道多么令人抓狂。但是懒人总是会创造出新科技,国外开发者为我们带来了今天要讲的协助设计网页排版及字型等相关属性的便利工具。typeanything前段时间登上国外媒体网站后深获好评,这是一项非常方便的在线工具,功能设计很简单,主要提供一段文章模板(里头包含h1、h2…

    2022年5月11日
    132
  • 查看linux执行的命令记录_history命令详解

    查看linux执行的命令记录_history命令详解前言我们每次敲打linux命令的时候,有时候想用之前用过的命令,一般情况下,我们都会按↑↓箭头来寻找历史的命令记录,那如果我想用1天前执行的某条命令,难道还要按↑100次?显示这样是不现实的,我们可

    2022年7月30日
    6
  • js实现modbus_Modbus通讯协议「建议收藏」

    js实现modbus_Modbus通讯协议「建议收藏」Modbus通讯协议Modbus概述Modbus是由Modicon公司(现为施耐德电气的一个品牌)在1978年发明的,这是一个跨时代、里程碑式的网络协议,因为工业网络从此拉开了序幕。Modbus是全球第一个真正用于工业现场的总线协议,据不完全统计:截至到2004中,Modbus的节点安装数量已经超过了800万个,而且75%的产品为非施耐德产品,安装的地区遍及世界各地,可见其普及的程度,已经成为了事…

    2022年7月14日
    26
  • 解决Oracle数据库1521端口telnet不通问题

    解决Oracle数据库1521端口telnet不通问题现象:服务器的ip地址可以ping通,但是安装oracle过程中的指定的“1521”端口telnet不通过解决办法:1、确保防火墙对1521端口开启; 2、修改oracle安装之后的文件tnsnames.ora(F:\install\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora)中“HOST”的值为”计算机全名“(桌面属性\高级

    2022年5月27日
    552
  • eclipse怎么导入mybatis项目_eclipse插件离线安装教程

    eclipse怎么导入mybatis项目_eclipse插件离线安装教程1.打开eclipse找到help,点击所选位置2.在查找那输入“MyBatis”,选择一个你所需的版本,进行Install3.点击“Iacceptthetermsofthelicenseagreement”4.点击完成…

    2022年10月6日
    3

发表回复

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

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