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)。



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

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

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


相关推荐

  • 作为大学生,如何通过学校认证免费获取正版matlab[通俗易懂]

    作为大学生,如何通过学校认证免费获取正版matlab[通俗易懂]时间有限,内容从简主要介绍大学生如何免费获取正版matlab,前提是贵学校已经为你提供了正版的matlab!!!否则,可以直接点右上角了。1.背景介绍作为前大学生,需要用matlab,又不想用盗版,也不想搞激活成功教程之类的,麻烦死了1.1直接上MathWorks官网matlab正版对于学生来说很贵。standard版的一年¥6,200,永久的¥15,500.education版的分…

    2022年10月11日
    0
  • 12864液晶并行方式显示

    12864液晶并行方式显示

    2021年12月1日
    47
  • windows下如何创建没有名字的.htaccess文件

    windows下如何创建没有名字的.htaccess文件

    2021年10月9日
    29
  • 计算机网络技术现代安防是啥意思,现代化校园视频安防监控系统 具有哪些特点呢…

    计算机网络技术现代安防是啥意思,现代化校园视频安防监控系统 具有哪些特点呢…原标题:现代化校园视频安防监控系统具有哪些特点呢校园视频安防监控系统主要是利用监控设备对学校场所进行全方位、全高清视频立体化管理和监控,从而维护校园秩序和安全,同时能为同学们的生活和学习营造更好的安全环境。那么现代化校园视频安防监控系统具有哪些特点呢?今天就和小编一起来学习了解下吧。1、可靠性与安全性校园视频安防监控系统的设计应具有较高的可靠性,在校园视频安防监控系统故障或事故造成中断后,能确…

    2022年6月28日
    20
  • XXE修复方案参考

    XXE修复方案参考XXE不同的库修复代码,略有差别,但都是通过:1、禁止加载外部实体;2、不允许XML中含有任何自己声明的DTD。可以解决

    2022年5月23日
    43
  • Perl正则表达式详解[通俗易懂]

    Perl正则表达式详解[通俗易懂]Perl中的正则表达式使用示例m//修饰符LVALUE=~m/PATTERN/;LVALUE=~/PATTERN/;修饰符含义/i匹配时忽略大小写/g全局匹配,默认情况下,正则表达式”abc”匹配”abcdabc”字符串的时候,将之匹配左边的abc,使用g将匹配两个”abc”/c在开启g的情况下,如果匹配失败,将不重置搜索位置/m多行匹配模式/s让.可以匹配换行符”\n”,也就是说该修饰符让.真的可以匹配任意字符/x允许正则表达

    2022年5月31日
    46

发表回复

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

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