Linux驱动编程中EXPORT_SYMBOL()介绍

一、查看内核驱动代码你会发现很多的函数带有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=(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=(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、运行结果效果图:

在这里插入图片描述

作者:海月汐辰
来源:CSDN
原文:https://blog.csdn.net/qq_37858386/article/details/78444168
版权声明:本文为博主原创文章,转载请附上博文链接!

来源:网络


智能推荐

Linux设备驱动模块编程02

其中用到了EXPORT_SYMBOL宏来表明导出printMSG这个符号。还有一个EXPORT_SYMBOL_GPL宏,导出的符号具有GPL授权。内核所有的导出符号可以通过 : cat /proc/kallsyms来查看,太多了,所以最好导出到一个文件中慢慢看。在其中就可以发现printk等等我们常见的内核函数。 现在我们写一个测试模块B,他将调用A中的printMSG函数。B的源码和A大致一样,...

Linux设备驱动模块编程01

Linux设备驱动学习 1.linux设备驱动程序的作用 简单的说,驱动程序告诉了我们可以提供了那些能力,但是没有告诉我们怎么使用这些能力。按照《linux设备驱动程序》上的说法,前一部分叫做”机制”,后面的叫作”策略”。linux设备驱动程序完成来自上层软件的抽象调用,让上层不用去关心底层到底怎么实现。比如说音频设备驱动,提供了一个接口 plays...

linux驱动编程(七)--内核Makefile编译

一、内核编译器路径设置 在源码目录Makefile文件中,可以设置编译路径“CROSS_COMPILE” 二、Makefile编译文件 Makefile文件中: 强制编译 obj-y 配置编译 obj-$(CONFIG_LEDS_CTL) 依赖编译 一个驱动的编译需要另外驱动的支持 这一部分不需要另外写编译脚本,只需要在Kconfig中配置即可 三、Linux内核编译流程分...

linux驱动编程之设备注册

linux下编写驱动时有注册设备这一步,设备注册有两种方法,一种是直接以平台的形式添加,平时都是用这种方式实现,另一种则是编译成.c文件,通过ko文件添加进去,其实就是将以平台的方式添加的过程通过自己的代码实现出来,如下是这两种的实现过程: 1.以平台的形式添加: (1). 将设备结构体放到平台文件中,平台会自动注册设备。平台文件都在arch/目录下,具体参考实际的芯片:   ...

Linux内核分析与驱动编程-1

Linux内核分析与驱动编程-1 声明 Course Introduction Linux Basic Knowledge 版本 内核开发流程 Linux Kernel Introduction Unix GNU Open Source Licenses POSIX标准 Linux Kernel Version Distributions Supported architectures OS an...

猜你喜欢

Linux I2C 驱动编程

Linux I2C 驱动编程 1.Linux 系统已经将I2C驱动的功能基本完成,我们只需要将相关的结构体补充,完成注册就可以正常使用,具体 I2C驱动的知识不在做说明。 2.测试环境 Linux-3.4 内核,硬件环境 JZ2440开发板 3.开发过程:由于I2C采用类似于Platform驱动实现形式,所以此处采用设备和驱动分开,以lkt4306为例 (1)编写 lkt4306_dev.c 文件...

Linux驱动技术(三) _DMA编程

DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率,现代的CPU都采用多级缓存结构,其中就包括使用多级Cache技术来缓存内存中的数据来缓解CPU和内...

Linux驱动---模块化编程实例

头文件 这个头文件和平时见的头文件不同,这个程序是放在内核空间的,像include<stdio.h>这种头文件是在用户空间里调用,内核空间和用户空间是两种不同的地址空间(应用程序所看到的地址一般是用户空间的虚拟地址) MODILE_LICENSE(“GPL”);和MODILE_AUTHOR(“ZJY”); “GPL&rdquo...

Java Web 学习路线(2018)

实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了。 大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算是学完了,找工作对你来说或许还有些距离,而我已经有了自己喜欢的工作,从一个自学狂人的角度,我只能给你比较实用但有限的建议: 如果 .Net 你是刚入门, 建议转学 JavaWeb 或 Android...

JMeter源码导入到Intellij IDEA(转)

转载:https://blog.csdn.net/collonn/article/details/78565300 看这里,JMeter二次开发,JMeter Plugin开发,JMeter插件开发,基于JMeter5.1.1 环境: windows10操作系统,jdk1.8,Intellij IDEA 2019.2.3,jmeter5.1.1 下载jmeter源码包 jmeter源码下载地址,h...

问答精选

Core Data ordered many-to-many relationships

Using Core Data, I have two entities that have many-to-many relationships. So: Both relationships are set up as 'ordered' so I can track they're order in a UITableView. That works fine, no problem. I ...

AngularJS in innerHTML with SweetAlert

I'm trying to build an sign in/sign up form in SweetAlert. Everything works fine but I'm trying to put an select with options that are made of ng-repeat from my array. This is my code : Part of my inn...

Adding p:column programatically with filterBy and sortBy attributes

I'm trying to create datatable column pragmatically ,using primeface 5.2 ,wildfly ,Mojarra 2.2.6 I have inherited from DataTable, and creating my own Columns,i want to set the sortBy,filterBy attribut...

How can I disable href link in cfgrid cells for blank rows?

I have the following cfgrid: Since pagesize is 10, I'll have some blank rows if I have less than 10 rows in the grid. For those blank row I'd have a '-' sign in place of the usual data, and the hrefke...

How to specify multiple TimestampType and DataType formats while reading CSV to dataframe in Spark?

The CSV file I am reading contains 3 columns. Below are the format of the columns. Format of DateTime1 is "mm/dd/yyyy hh:mm:ss" Format of DateTime2 is "dd/mm/yy hh:mm:ss" Format of...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答