linux EXPORT_SYMBOL

内核符号表能够分为“私有”和“公共”。等闲所说的内核符号表指的是“公共内核符号表”。
我们懂得,驱动存在于内核空间,它的每一个函数每一个变量都会有对应的符号,这局部符号也能够称作内核符号,它们不导出的话就只能为切身所用,导出后就能够成为公用,对于导出的那局部的内核符号即便我们常说的内核符号表。insmod的时候并不是所有的函数都获得内核符号表去寻找对应的符号,因为每一个驱动在自己分配的空间里也会存在一份符号表,里面有关于这个驱动里利用到的变量以及函数的一些符号,驱动率先会在这里边找,万一觉察某个符号未曾了,那么就会去公共内核符号表中搜查,搜素到了,则该模块加载获胜,搜查不到则该模块加载失利。
对于2.4内核和2.6内核的内核符号表是有差异的,2.4内核默认情形下模块中的非静态大局变量以及非静态函数在模块加载后会积极导出到内核符号表中,而2.6内核默认情形下是不会积极导出的,必需显式调用宏EXPORT_SYMBOL能力导出。导出的符号前面等闲标注有r符号。能够穿越nm -l xx.ko来察看某一个模块里的符号情形。可能穿越察看内核符号表文件也行。对于2.4是:cat /proc/ksymssy.syygr.comhn.hnxinshiji.com,路遥对于2.6是:cat /proc/kallsyms.
最后归纳,对于一个模块来讲,万一仅攀附切身就能够告终自己的功能,那么能够无须要导出任何符号,只有其他模块中必需利用到该模块供给的函数时,就定然要举行导出垄断。就显得极其的不够用了。

 

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。
在模块mod1中,EXPORT_SYMBOL(func1);
在模块mod2中,extern int func1();
就可以在mod2中调用func1了。

=================================

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对之声明
   第三、首先加载定义该函数的模块,再加载调用该函数的模块

另外,在编译调用某导出函数的模块时,往往会有WARNING: "****" [**********] undefined!
使用dmesg命令后会看到相同的信息。开始我以为只要有这个错误就不能加载模块,后来上网查了一下,发现这主要是因为在编译连接的时候还没有和内核打交道,当然找不到symbol了,但是由于你生成的是一个内核模块,所以LD不提示error,而是给出一个warning,寄希望于在insmod的时候,内核能够把这个symbol连接上。

 


http://hi.baidu.com/leal/blog/item/d3e1cafcb97c2dfdfd037fc2.html

System.map[1]是Linux内核符号文件,维护有内核函数名称和非堆栈变量名称与各自地址的对应关系。

若内核函数或变量要被内核模块调用,则必须使用EXPORT_SYMBOL宏进行处理,作用之一是将该符号连接到二进制文件的各个__ksymtab_xx_xxsection(参看include/linux/module.h,使用GCC编译器的__attribute__关键字实现[2])。内核加载模块时,会先确认该模块调用的各内核函数是否已export(参看__find_symbol() kernel/module.c)。

比如FC5缺省会给vanilla内核打补丁,使其不再export sys_open符号,这一点可搜索该内核对应的System.map文件进行确认,看是否存在__ksymtab_sys_open符号。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值