我有两个内核模块,它们都使用EXPORT_SYMBOL()导出一些符号。 其中一个导出基本功能(sv1< -sv2)并且它有效但我遇到了另一个问题(sv1-> sv2)。
我想要的是导出 TASKLET 。我读到了可能的地方,并没有禁止这样做。模块nr 1(称为 sv1 )由 BH函数和tasklet声明组成:
struct tasklet_struct sv_takslet;
EXPORT_SYMBOL(sv_takslet);
void sv_tasklet_function( unsigned long data )
{
printk( "%s\n", (char *)data );
return;
}
static int __init sv_publisher_init(void)
{
...
tasklet_init(&sv_takslet, &sv_tasklet_function,&sv_tasklet_data);
...
}
在第二个模块中,有一个全局引用和 task_schedule()函数用于模块nr 2的初始化(称为 sv2 ):
extern struct tasklet_struct sv_takslet;
...
tasklet_schedule(&sv_takslet);
问题出在我得到的时候:
tasklet_schedule(&sv_takslet);
在我的代码中我没有在列表中看到我的两个模块( modprobe -l </ em>),但当我在 sv2 上评论此行时 - 他们神奇地出现了。
这种行为可能是什么原因?这个初始化是否正确?
修改
此问题的原因是模块 sv2 在 sv1 之前加载,并且不知道tasklet(line:extern struct tasklet_struct sv_takslet)。当我将 sv2 导出 TASKLET 的目的地更改为 sv1 时,问题就消失了。
但是现在我面临着两个模块必须互相导出符号。我不知道如何解决这个问题...
两个* .c文件都在同一个目录中,我的Makefile有以下行:
obj-m += sv_publisher.o zsv_core.o
有没有人有一些提示如何去做?