- 论坛徽章:
- 0
|
尝试写一个workqueue的例子,编译通过,insmod时却报错:
代码如下
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/sched.h>
- #include <linux/workqueue.h>
- #include <linux/interrupt.h>
- #include <asm/io.h>
- #define MY_WORK_QUEUE_NAME "my_test_sched"
- static struct workqueue_struct *my_workqueue;
- static void workqueue_task(void *arg)
- {
- printk("in function workqueue_task!\n");
- return;
- }
- int __init init_test()
- {
- char arg = 'x';
- struct work_struct task;
- my_workqueue = create_workqueue(MY_WORK_QUEUE_NAME);
- INIT_WORK(&task, workqueue_task, &arg);
- queue_work(my_workqueue, &task);
- return 0;
- }
-
- void __exit exit_test()
- {
- return;
- }
- module_init(init_test);
- module_exit(exit_test);
复制代码
编译结果:
- make -C /lib/modules/2.6.18/build M=/home/test/my_intrpt modules
- make[1]: Entering directory `/usr/src/linux-2.6.18'
- Building modules, stage 2.
- MODPOST
- make[1]: Leaving directory `/usr/src/linux-2.6.18'
复制代码
insmod时报错:
- my_intrpt: Unknown symbol __create_workqueue
- my_intrpt: Unknown symbol queue_work
- insmod: error inserting 'my_intrpt.ko': -1 Unknown symbol in module
复制代码
查看/proc/kallsyms结果:
- cat /proc/kallsyms | grep create_workqueue
- 输出:
- c011e288 t create_workqueue_thread
- c011e312 T __create_workqueue
- c011e312 U __create_workqueue [scsi_mod]
- cat /proc/kallsyms | grep queue_work
- 输出:
- c011de8c t __queue_work
- c011dec7 T queue_work
- c015cdfa t aio_queue_work
- d084ad88 r __kcrctab_scsi_queue_work [scsi_mod]
- d0840719 r __kstrtab_scsi_queue_work [scsi_mod]
- d084adac r __ksymtab_scsi_queue_work [scsi_mod]
- a894636a a __crc_scsi_queue_work [scsi_mod]
- d0838213 t scsi_queue_work [scsi_mod]
- c011dec7 U queue_work [scsi_mod]
复制代码
为什么会这样呢?
[ 本帖最后由 new_learner 于 2009-4-20 00:47 编辑 ] |
|