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)


相关推荐

  • OWASP TOP10系列之#TOP1# A1-注入类「建议收藏」

    OWASP TOP10系列之#TOP1# A1-注入类「建议收藏」OWASPTOP10系列之#TOP1#注入类提示:本系列将介绍OWASPTOP10安全漏洞相关介绍,主要针对漏洞类型、攻击原理以及如何防御进行简单讲解;如有错误,还请大佬指出,定会及时改正~文章目录OWASPTOP10系列之#TOP1#注入类前言一、注入类漏洞是什么?二、什么情况下会产生注入类漏洞问题?三、如何预防?四、具体示例1.SQL注入2.OS命令注入3.XPath注入总结前言在OWASP(开放式Web应用程序安全项目)公布的10项最严重的Web应用程序安全风险列表的在

  • 【Java】idea @NotNull @Nullable 注解

    【Java】idea @NotNull @Nullable 注解这两个注解在idea里面可以帮助我们检测方法的返回值,方法参数以及局部变量是否为空,从而帮助我们减少一些NPE的发生。1.原始注解@NotNull@Nullable最开始只能使用idea提供的一个jetBrainsjavaannotation的jar包下的注解。maven坐标:https://mvnrepository.com/artifact/org.jetbrains…

  • ssl协议未开启是什么意思?如何解决?_ssl协议未开启怎么解决

    ssl协议未开启是什么意思?如何解决?_ssl协议未开启怎么解决本文给大家介绍一下著名的网络安全协议SSL,如果有需要的朋友可以参考学习,希望以下的分享对您的学习有所帮助。安全套接字协议(SecureSocketLayer,SSL)是web浏览器与Web服务器之间安全交换的信息的协议。提供两个基本的安全服务:鉴别与保密。SSL是Netscape于1994年开发的,后来成为了世界上著名的web安全机制,所有主要浏览器都支持SSL协议。SSL协议由两层组成,分…

    2022年10月30日
  • 零基础学习JAVA其实并不难!不相信?进来看看你就知道了

    零基础学习JAVA其实并不难!不相信?进来看看你就知道了其实Java并没有想象中的那么难,首先想要入这个行,要做好一个心理准备,那就是你想走远点,就得不间断的去学习,去汲取知识,前期不能怕辛苦,不要闲下来就打LOL、吃鸡、王者农药,有空就得多看看各种开源项目的代码,API的设计方式,各大网站的设计架构,理解各个环节的作用。补齐自己的知识视野。  当然这个行业也并不是什么门槛都没有,不要再私信我初中生、高中生、中专生能不能学习Java了。反正我个人是认为不可行的,或许你可以去问问其他大神?或许他们会觉得可以的。  下图是我更新过的自学表,分别分为4个阶段。按

  • JAVA获取当前时间的三种方法

    JAVA获取当前时间的三种方法在Java中显示当前时间的三种方式,各有优缺点。

  • python中使用递归实现斐波那契数列

    python中使用递归实现斐波那契数列python中使用递归实现斐波那契数列python中使用递归实现斐波那契数列先来了解一下斐波那契数列(Fibonaccisequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)在现代物理、

发表回复

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

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