驱动中EXPORT_SYMBOL()的作用
linux2.6的“/prob/kallsyms”文件对应着内核符号表,记录了符号以及符号所在的内存地址。
模块可以使用如下宏导出符号到内核符号表:
view plaincopy to clipboardprint?
01.EXPORT_SYMBOL(符号名);
02.EXPORT_SYMBOL_GPL(符号名)
EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名)
导出的符号可以被其他模块使用,不过使用之前一定要声明一下。EXPORT_SYMBOL_GPL()只适用于包含GPL许可权的模块。
代码演示:
view plaincopy to clipboardprint?
01.//hello.c文件,定义2个函数,用于导出
02.#include <linux/init.h>
03.#include <linux/module.h>
04.MODULE_LICENSE("Dual BSD/GPL");
05.int add_integar(int a,int b)
06.{
07. return a + b;
08.}
09.int sub_integar(int a,int b)
10.{
11. return a - b;
12.}
13.EXPORT_SYMBOL(add_integar);
14.EXPORT_SYMBOL(sub_integar);
15.//test.c 用于调用hello模块导出的函数
16.#include <linux/init.h>
17.#include <linux/module.h>
18.MODULE_LICENSE("Dual BSD/GPL");
19.extern int add_integar(int ,int); //声明要调用的函数
20.extern int sub_integar(int ,int); //声明要调用的函数
21.int result(void)
22.{
23. int a,b;
24. a = add_integar(1,1);
25. b = sub_integar(1,1);
26.
27. printk("%d\n",a);
28. printk("%d\n",b);
29.
30. return 0;
31.}
//hello.c文件,定义2个函数,用于导出
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
int add_integar(int a,int b)
{
return a + b;
}
int sub_integar(int a,int b)
{
return a - b;
}
EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);
//test.c 用于调用hello模块导出的函数
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
extern int add_integar(int ,int); //声明要调用的函数
extern int sub_integar(int ,int); //声明要调用的函数
int result(void)
{
int a,b;
a = add_integar(1,1);
b = sub_integar(1,1);
printk("%d\n",a);
printk("%d\n",b);
return 0;
}
make后,先加在hello模块,再加载test模块。
然后cat /proc/kallsyms | grep integer
显示:
view plaincopy to clipboardprint?
01.[root@localhost test]# cat /proc/kallsyms |grep integar
02.e053d000 u add_integar [test]
03.e053d004 u sub_integar [test]
04.e053d02c r __ksymtab_sub_integar [hello]
05.e053d03c r __kstrtab_sub_integar [hello]
06.e053d034 r __ksymtab_add_integar [hello]
07.e053d048 r __kstrtab_add_integar [hello]
08.e053d000 T add_integar [hello]
09.e053d004 T sub_integar [hello]
驱动中EXPORT_SYMBOL()的作用相关推荐
- Linux驱动编程中EXPORT_SYMBOL()介绍
一.查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义. 二.那么EXPORT_SYMBOL的作用是什么? EXPORT_SYMBOL标签内定义的函数或者 ...
- Linux字符设备驱动中container_of宏的作用
Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...
- Linux设备驱动开发-linux驱动中的阻塞访问方式
阻塞与非阻塞是设备访问的两种不同的模式.什么是阻塞操作呢?其是指在执行设备操作的时候,如果不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.而非阻塞操作则是在进程不能进行设备操作时,并不挂起到 ...
- Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用
关与设备树的概念,我们在Exynos4412 内核移植(六)-- 设备树解析 里面已经学习过,下面看一下设备树在设备驱动开发中起到的作用 Device Tree是一种描述硬件的数据结构,设备树源(De ...
- Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O
在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程--网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...
- Science:亚硝酸盐氧化细菌在黑暗海洋中的主要作用
文章目录 亚硝酸盐氧化细菌在黑暗海洋中的主要作用 写在前面 摘要 热心肠日报 背景 结果 图1 非全长16S rRNA基因序列的系统发育树 图2 通过募集宏基因组片段的方法确定亚硝酸盐氧化细菌单扩增基 ...
- 丰度决定了细菌在复杂群落中的功能作用
本文转载自"微生态笔记",已获授权 标题:Abundance determines the functional role of bacterial phylotypes in c ...
- EXPORT_SYMBOL的作用是什么
http://www.cnblogs.com/riskyer/p/3221805.html EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动 导入到 ...
- 【整理】Linux驱动中,probe函数何时被调用
声明:以下主要内容参考自: 关于struct device_driver结构中的probe探测函数的调用 http://blog.chinaunix.net/u2/71164/showart.php? ...
最新文章
- shell用到的命令(2) —— break,continue,echo,eval,
- JavaScript学习与实践(8)
- 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第4章-带有事件驱动控制的分数阶多智能体系统的一致性
- 这年头,老赖没得混了!大数据式追债,你见过吗?
- 半监督学习技术在金融文本分类上的实践
- 【Redis】2. Redis数据类型 String以及key的设置约定
- dataframe 如何选中某列的一行_如何用 Python 在笔记本上分析 100GB 数据?
- 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)
- python安装idle_怎么在windows下的Python开发工具IDLE里安装其他模块
- Java Swing中国象棋AI(人机和人人对战)
- c语言文件指针重新定向,C语言rewind()函数:将文件指针重新指向文件开头
- CPU中控制器的功能
- ROS,Ubuntu,noobs,raspbian和raspbeery pi3的关系
- The Butcher
- 三星堆的青铜机器人_三星堆出土世界同期最高、最完整的青铜立人像 他有两个未解之谜...
- 高数 | 【概念剖析】一元、二元微分,连续、可微、可偏导、偏导连续的超强通俗解析!
- wo de wen jian
- vb.net 简单的方法模拟三体(有行星)
- 关于数独游戏的实现(一)
- XXL-JOB配置笔记