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


相关推荐

  • 800个有趣句子帮你记忆7000个单词[通俗易懂]

    800个有趣句子帮你记忆7000个单词[通俗易懂]800个有趣句子帮你记忆7000个单词   1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。 2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将

    2022年6月7日
    21
  • 二叉树 二叉搜索树_判断二叉树是否是二叉排序树

    二叉树 二叉搜索树_判断二叉树是否是二叉排序树原题链接一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出格式:如果输入序列是对一棵二叉搜索树或

    2022年8月8日
    3
  • java类加载的过程 父_类加载机制原理

    java类加载的过程 父_类加载机制原理JVM和类当我们调用Java命令运行某个Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序有多么复杂,该程序启动了多少个线程,它们都处于该Java虚拟机进程里。同一个JVM的所有线程、所有变量都处于同一个进程里,它们都使用该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止:程序运行到最后正常接收; 程序运行到使用Sys…

    2022年8月11日
    4
  • varchar2和varchar2(char)_datetime数据类型

    varchar2和varchar2(char)_datetime数据类型charvarcharvarchar2的区别 区别:1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的,比如,存储字符串“abc”,对于CHAR(20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2(20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。 2.CHAR的效率比VARCHAR2的效

    2022年4月20日
    48
  • 微信web开发者工具详解_微信web开发者工具官方下载

    微信web开发者工具详解_微信web开发者工具官方下载一、微信小程序web开发工具下载地址 1.1 在微信公众平台-小程序里边去下载开发工具下载地址。1.2下载后安装一下就可以使用了:二、创建项目 2.1 微信小程序web开发工具需要扫码登陆,所以必…

    2025年5月27日
    2
  • 频谱分析仪怎么测频率_声音测试软件

    频谱分析仪怎么测频率_声音测试软件GSM信号的测量现代高度发达的通信技术可以让人们在地球的任意地点控制频谱分析仪,因此就更要懂得不同参数设置和不同信号条件对显示结果的影响。典型的全球移动通信系统(GSM)的信号测量如图1所示,它清楚地标明了重要的控制参数设置和测量结果。IFR2399型频谱分析仪利用彩色游标来加亮测量区域,此例中,被加亮的测量区域是占用信道和上下两个相邻信道的中心50kHz频带。显示的水平轴(频率轴)中心频率为90…

    2022年8月11日
    5

发表回复

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

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