免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6777 | 回复: 5
打印 上一主题 下一主题

/proc/kallsyms下的symbol可以直接引用吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-19 23:31 |只看该作者 |倒序浏览
尝试写一个workqueue的例子,编译通过,insmod时却报错:

代码如下

  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/sched.h>
  4. #include <linux/workqueue.h>
  5. #include <linux/interrupt.h>
  6. #include <asm/io.h>

  7. #define MY_WORK_QUEUE_NAME "my_test_sched"

  8. static struct workqueue_struct *my_workqueue;

  9. static void workqueue_task(void *arg)
  10. {
  11.         printk("in function workqueue_task!\n");
  12.         return;
  13. }

  14. int __init init_test()
  15. {
  16.         char arg = 'x';
  17.         struct work_struct task;

  18.         my_workqueue = create_workqueue(MY_WORK_QUEUE_NAME);

  19.         INIT_WORK(&task, workqueue_task, &arg);

  20.         queue_work(my_workqueue, &task);

  21.         return 0;
  22. }
  23.        

  24. void __exit exit_test()
  25. {
  26.         return;
  27. }

  28. module_init(init_test);
  29. module_exit(exit_test);
复制代码


编译结果:

  1. make -C /lib/modules/2.6.18/build M=/home/test/my_intrpt modules
  2. make[1]: Entering directory `/usr/src/linux-2.6.18'
  3. Building modules, stage 2.
  4.   MODPOST
  5. make[1]: Leaving directory `/usr/src/linux-2.6.18'
复制代码


insmod时报错:

  1. my_intrpt: Unknown symbol __create_workqueue
  2. my_intrpt: Unknown symbol queue_work
  3. insmod: error inserting 'my_intrpt.ko': -1 Unknown symbol in module
复制代码


查看/proc/kallsyms结果:

  1. cat /proc/kallsyms | grep create_workqueue
  2. 输出:
  3. c011e288 t create_workqueue_thread
  4. c011e312 T __create_workqueue
  5. c011e312 U __create_workqueue        [scsi_mod]


  6. cat /proc/kallsyms | grep queue_work
  7. 输出:
  8. c011de8c t __queue_work
  9. c011dec7 T queue_work
  10. c015cdfa t aio_queue_work
  11. d084ad88 r __kcrctab_scsi_queue_work        [scsi_mod]
  12. d0840719 r __kstrtab_scsi_queue_work        [scsi_mod]
  13. d084adac r __ksymtab_scsi_queue_work        [scsi_mod]
  14. a894636a a __crc_scsi_queue_work        [scsi_mod]
  15. d0838213 t scsi_queue_work        [scsi_mod]
  16. c011dec7 U queue_work        [scsi_mod]
复制代码



为什么会这样呢?

[ 本帖最后由 new_learner 于 2009-4-20 00:47 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-20 23:32 |只看该作者
你要引用内核的符号,需要在你的模块添加
modlicense("GPL");
具体怎么拼忘了。

论坛徽章:
0
3 [报告]
发表于 2009-04-21 12:59 |只看该作者
原帖由 emmoblin 于 2009-4-20 23:32 发表
你要引用内核的符号,需要在你的模块添加
modlicense("GPL");
具体怎么拼忘了。

谢谢提醒,就是这个原因。
MODULE_LICENSE("GPL");

另外,我这个例子也有很多错误,不应该用stack变量,而应该用global指针来传入workqueue。

论坛徽章:
0
4 [报告]
发表于 2014-04-10 16:39 |只看该作者
回复 3# new_learner

你好@ 我参照这个代码,编译插入这个模块后就死机,我也添加了MODULE_LICENSE("GPL"); 还有你说的workqueue应该是static应该是global,我也把前面的static去掉了,但是编译完成后,一插入模块就就死机,能不能把你后来编译正确的源代码贴出来啊,万分感谢,在线等!
   

论坛徽章:
0
5 [报告]
发表于 2014-04-10 19:50 |只看该作者
本帖最后由 鬼鬼一哈 于 2014-04-10 19:51 编辑

18.int __init init_test()

19.{

20.        char arg = 'x';

21.        struct work_struct task;                            //把这个定义为全局


23.        my_workqueue = create_workqueue(MY_WORK_QUEUE_NAME);

25.        INIT_WORK(&task, workqueue_task, &arg);

27.        queue_work(my_workqueue, &task);

29.        return 0;

30.}

论坛徽章:
0
6 [报告]
发表于 2014-04-14 15:11 |只看该作者
回复 5# 鬼鬼一哈


    可以了,谢谢@!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP