Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101388
  • 博文数量: 21
  • 博客积分: 193
  • 博客等级: 入伍新兵
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-30 10:36
文章分类
文章存档

2011年(21)

分类:

2011-10-26 18:03:59

  1. 在使用EXPORT_SYMBOL 的.c文件中 需要 #include <linux/module.h> 文件。

  2. 1、EXPORT_SYMBOL的作用是什么?
  3. EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,
  4. 即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。
  5. 这里要和System.map做一下对比:
  6. System.map 中的是连接时的函数地址。连接完成以后,在2.6内核运行过程中,是不知道哪个符号在哪个地址的。
  7. EXPORT_SYMBOL 的符号
  8. 是把这些符号和对应的地址保存起来,在内核运行的过程中,可以找到这些符号对应的地址。而模块在加载过程中
  9. ,其本质就是能动态连接到内核,如果在模块中引用了内核或其它模块的符号,就要EXPORT_SYMBOL这些符号,这样才能找到对应的地址连接。
  10.  
  11. 2、使用方法
  12.    第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)
  13.    第二、在调用该函数的模块中使用extern对之声明
  14.    第三、首先加载定义该函数的模块,再加载调用该函数的模块
  15.  
  16. 另外,在编译调用某导出函数的模块时,往往会有WARNING: "****" [**********]
  17. 使用dmesg命令后会看到相同的信息。主要是因为在编译连接的时候还没有和内核打交道,当然找不到symbol了,但是由于你生成的是一个内核模块,所以LD不提示error,而是给出一个warning,寄希望于在insmod的时候,内核能够把这个symbol连接上。

  18. cat /proc/kallsyms会打印出内核当前的符号表,其中第一列是该符号在内核地址空间中的地址;第二列是符号属性,小写表示局部符号,
  19. 大写表示全局符号,具体含义参考man nm; 第三列表示符号字符串. 这里只显示EXPORT_SYMBOL,EXPROT_SYMBOL_GPL处理过的符号。

  20. 通过more /boot/System.map-xxx 可以查看内核符号列表。可以显示编译好内核后所有在内核中的符号,模块中的要另行查看。

  21. 通过nm vmlinux也可以查看内核符号列表,模块中的要另行查看

  22. 通过nm module_name可以查看模块的符号列表

  23. 模块是动态加载的,需要一个运行时存在的符号表,找到符号。而我们一般所说的符号表是供静态连接时定位符号地址用的。
  24. EXPORT_SYMBOL宏的作用就是把静态符号表中的符号和地址放到运行时的符号表中(在一个section中)供运行时寻找符号用。
阅读(2800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~