Linux驱动编程中EXPORT_SYMBOL()介绍

Linux驱动编程中EXPORT_SYMBOL()介绍一、查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义。二、那么EXPORT_SYMBOL的作用是什么?      EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。三、使用方法 

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


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

Linux驱动编程中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、运行结果效果图:

Linux驱动编程中EXPORT_SYMBOL()介绍

      5、小结:从上面的打印信息看,模块export_symbol_two.ko里面的函数function_two(void)可以调用模块export_symbol_one.ko里面的函数function_one(void)。



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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157962.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • pr怎么裁剪整个视频画面大小_pr如何截取视频画面的一部分

    pr怎么裁剪整个视频画面大小_pr如何截取视频画面的一部分制作视频,有时候我们只需要视频的一部分,多余的部分就需要给裁剪掉,那么Premiere(pr)怎样剪裁视频画面大小呢。工具/材料AdobePremiereProCS6首先把要剪裁的视频拖动

  • 软件,硬件版本号命名规范是什么_版本号格式

    软件,硬件版本号命名规范是什么_版本号格式软件、硬件版本号命名规范常见版本号规范示例如v1.0.0通用版本命名规范如下:主版本号.子版本号.修订版本号.日期_版本阶段如v1.2.3.20201228_rc主版本号(1)功能模块发生较大变动,如增加多个模块/整体架构改变子版本号(2)功能增加或变化修订版本号(3)Bug修复或小变动,间隔不限,修复一个严重bug即可发布一个修订版由项目经理决定日期版本号(20201228)记录修改项目的当前日期,每天对项目修改都更改由开发人员决定希腊字母版本号(rc)标注当前版本的软

  • 哈佛幸福课笔记[通俗易懂]

    哈佛幸福课笔记[通俗易懂]第一课什么是积极心理学1、快乐由精神状态决定,而不是社会地位和银行存款2、成功的两个因素:相信自己、保持好奇不断学习第二课为什么要学习积极心理学1、你所问的问题决定了你的感受,当一个人总是问自己:我的弱点是什么?我如何做的更好?他会忽略自己的优点,认为优点是不存在的2、从专注缺点到专注优点3、做一个行动者,行动可以增加自信,而不是一个被动者抱怨者第三课幸福是一…

  • Nginx报错:Sorry, the page you are looking for is currently unavailable. Please try again later.

    Nginx报错:Sorry, the page you are looking for is currently unavailable. Please try again later.

    2021年10月28日
  • Navicat 15 for MySQL 激活码(破解版激活)

    Navicat 15 for MySQL 激活码(破解版激活),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 苹果跳过id教程_苹果手机怎么绕过ID

    苹果跳过id教程_苹果手机怎么绕过ID如果您是非法渠道获得的手机请关闭本网页。常见问题汇总:iPhone5s,iPhone6、6plus,iPhoneSE,6S,iPhone6SPiPhoneSE,iPhone7,iPhone7P,iPhone8/iPhone8P,iPhoneX。iPadMini2,iPadMini3,iPadMini4,iPadAir,iPadPro(12.9…

发表回复

您的电子邮箱地址不会被公开。

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