http://www.cnblogs.com/riskyer/p/3221805.html

EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动

导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。

2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。

1、EXPORT_SYMBOL的作用是什么?

EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代

码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符

号的方式导出给其他模块使用。

这里要和System.map做一下对比:

System.map 中的是连接时的函数地址。连接完成以后,在2.6内核运行过程中,是不知道哪个符号在哪个地址的。
EXPORT_SYMBOL 的符号, 是把这些符号和对应的地址保存起来,在内核运行的过程中,可以找到这些符号对应的地址。而模块在加载过程中,其本质就是能动态连接到内核,如果在模块中引 用了内核或其它模块的符号,就要EXPORT_SYMBOL这些符号,这样才能找到对应的地址连接。

2、使用方法
第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)
第二、在掉用该函数的模块中使用extern对之声明

第三、首先加载定义该函数的模块,再加载调用该函数的模块

例如:

一个模块mod1中定义一个函数func1;

在另外一个模块mod2中定义一个函数func2,func2调用func1。

在模块mod1中,EXPORT_SYMBOL(func1);

在模块mod2中,extern int func1();

就可以在mod2中调用func1了。

(1)helloworld.c

#include <linux/module.h>
#include <linux/init.h>MODULE_LICENSE("GPL");static void hello_fun(void)
{printk("##### helloworld####\n");
}
EXPORT_SYMBOL(hello_fun);static int __init hello_init(void)
{printk(KERN_ERR "#### hello world\n");return 0;
}static void __exit hello_exit(void)
{printk(KERN_ERR "#### exit\n");
}module_init(hello_init);
module_exit(hello_exit);

Makefile

obj-m := hello.o
hello-objs := helloworld.oKID := /lib/modules/`uname -r`/build
PWD := $(shell pwd)all:make -C $(KID) M=${PWD} modulesclean:rm -rf *.o .cmd *.ko *.mod.c .tmp_versions

(2)call-module.c

#include <linux/module.h>
#include <linux/init.h>extern void hello_fun(void);static int __init hello_init(void)
{hello_fun();return 0;
}static void __exit hello_exit(void)
{printk(KERN_ERR "#### exit\n");
}MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

Makefile

obj-m := call-module.oKID := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
KBUILD_EXTRA_SYMBOLS=/usr/src/linux-headers-3.5.0-34-generic/Module.symversKBUILD_EXTRA_SYMBOLS +=/home/snail/work/2.linux-driver/1.helloworld/Module.symversall:make -C $(KID) M=${PWD} modulesclean:rm -rf *.o .cmd *.ko *.mod.c .tmp_versions *.order *.symvers .*

(3)

加载 hello.ko

sudo insmod ./hello.ko

加载 call-module.ko

sudo insmod ./call-module.ko

观察 dmesg

<4>[ 3837.857657] ##### helloworld####

(4)注意事项

加载call-module.ko可能会出现

“NO SYMBOL VERSION FOR”问题

解决:

这是linux kernel 2.6.26 之后版本的bug (详细描述, 请看http://bugzilla.kernel.org/show_bug.cgi%3Fid%3D12446)
并且这个bug不会被fix
解决办法:

(1)mod_a的Module.symvers放到mod_b的当前路径,从而编译mod_b,符号信息会自动连接进去.
(2)或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers,

如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers
编译mod_b时,搜索Module.symvers的路径是:
1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
2, makefile中M=所指定的路径, 它等效于变量KBUILD_EXTMOD的值
3, 变量KBUILD_EXTRA_SYMBOLS的值

问题的本质:
简单说来,就是小b生成的时候不知道小a symbol的校验码,小b加载的时候自然check 校验码出错。

EXPORT_SYMBOL的作用是什么相关推荐

  1. EXPORT_SYMBOL的作用浅析

    在查看内核驱动代码的时候会经常看到在一些函数后面总会跟EXPORT_SYMBOL()这样的宏定义,通过网上查阅,它的作用大致总结如下: 1.定义说明 把内核函数的符号导出,也可以理解成将函数名作为符号 ...

  2. 宏EXPORT_SYMBOL在内核中的作用

    Module运行在kernel space,不能直接调用应用程序库,只能调用内核函数. EXPORT_SYMBOL的作用是把内核函数的符号导出,也就是将函数的入口地址导出. Module在运行的时候会 ...

  3. Linux驱动编程中EXPORT_SYMBOL()介绍

    一.查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义. 二.那么EXPORT_SYMBOL的作用是什么?            EXPORT_SYMBOL标签内定义的函数或者 ...

  4. 谈EXPORT_SYMBOL使用

    [转载]谈EXPORT_SYMBOL使用 转自:http://www.cnblogs.com/GT_Andy/archive/2011/06/23/2088127.html EXPORT_SYMBOL ...

  5. EXPORT_SYMBOL使用

    EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的. 2.6就必须用EXP ...

  6. Linux 驱动开发之内核模块开发(四)—— 符号表的导出

    Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏. 如果你的模块需要输出符号给其 ...

  7. linux模块导出符号 EXPORT_SYMBOL_GPLEXPORT_SYMBOL(转)

    转自:http://blog.csdn.net/angle_birds/article/details/7396748 一个模块mod1中定义一个函数func1:在另外一个模块mod2中定义一个函数f ...

  8. wifi底层学习之路:三,Linux内核子系统mac80211

    1,mac80211是什么? mac80211是linux内核子系统,是驱动开发者可用于为softmac无线设备写驱动的框架.mac80211在内核空间实现STA模式.在用户空间实现AP模式. 2,m ...

  9. 主线剧情07.3-Linux驱动编程-内核态API总结备查

    驱动程序 中的 设备相关 和 常用内核态 API 总结备查 多处网搜和引用,做了良好的整理,侵删. 本文对应的驱动源代码在 github/gitee 仓库里:并且 在 Github 上的原版文章日后可 ...

最新文章

  1. oracle之 11g RAC R2 体系结构---Grid
  2. Mendeley Desktop 很好用的一个文件管理软件
  3. 工业用微型计算机(16)-指令系统(11)
  4. windows上的几个常用端口号
  5. 中service层的作用_浅析Java中dto、dao、service、controller的四层结构
  6. HAProxy杂记(1)
  7. linux14.10硬盘安装,Windows 10下硬盘安装Ubuntu 14.10图文教程
  8. 剑指offer(1)
  9. threejs 纹理流动_ThreeJs 认识纹理
  10. cornerstone 使用
  11. Struts2+Spring4+Hibernate4项目整合
  12. Java网络编程之URL、URLConnection、URLEncoder、URLDecoder
  13. 51单片机c语言音乐代码天空之城,蜂鸣器版天空之城(示例代码)
  14. 用粉红噪声煲机_煲机知识 | 煲机常用的粉红噪音和白噪音是什么?
  15. 安徽太极计算机 刘建春,阅读理解的检测作业
  16. 让生活服务“说到做到”,美团语音应用平台的底气在哪里?
  17. win10下cygwin安装
  18. 苹果超薄笔记本MBA设计缺陷
  19. 支付宝sdk集成,报系统繁忙 请稍后再试(ALI64)
  20. 【CSDN周赛第38期】Python题解

热门文章

  1. 2019上海车展展后报告(整车篇)
  2. 计算机视觉已超越人类眼睛?腾讯优图与《科学》杂志全面解读
  3. 工业4.0进行时:工业机器人为何能够快速爆发?
  4. 秒抢红包的背后,是复杂的即时付款系统
  5. 我是一个秒杀请求,正在逃离这颗星球...
  6. 贝叶斯定理:AI 不只是个理科生 | 赠书
  7. 论对一个程序的满意程度 | 每日趣闻
  8. 【NetApp】7mode options选项解释
  9. 自然语言处理中的N-Gram模型
  10. 关于 AppDelegate 、UIApplication 简单的用法