Chinaunix首页 | 论坛 | 博客
  • 博客访问: 394611
  • 博文数量: 112
  • 博客积分: 4535
  • 博客等级: 上校
  • 技术积分: 1120
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-12 10:57
文章分类

全部博文(112)

文章存档

2014年(1)

2013年(1)

2012年(18)

2011年(10)

2010年(16)

2009年(48)

2008年(9)

2007年(9)

我的朋友

分类: LINUX

2012-06-06 10:17:28

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

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

 

1EXPORT_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连接上。


个人遇到的问题:

在编译3.0.8内核过程中,应该是Makefile中将未声明的内核函数直接调用归为ERROR,所以编译过程中直接就是“ error: implicit declaration of function '*******'”;

解决办法:extern该函数即可;也许还有别的办法,未继续深究下去,如果有的话,还请不吝指教一二,先谢了。


参考资料:

http://tanatseng.blog.163.com/blog/static/17499162920113963913630/

阅读(1855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~