我有两个内核模块,它们都使用 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);
...
}
在第二个模块中,在初始化模块 nr 2 (称为sv2 )时使用了全局引用和task_schedule()函数:
extern struct tasklet_struct sv_takslet;
...
tasklet_schedule(&sv_takslet);
问题是当我得到:
tasklet_schedule(&sv_takslet);
在我的代码中,我没有在列表中看到我的两个模块(modprobe -l),但是当我在sv2上评论这一行时- 它们神奇地出现了。
这种行为的原因可能是什么?这个初始化是否正确?
编辑
这个问题的原因是模块sv2在sv1之前加载并且不知道 tasklet(行:extern struct tasklet_struct sv_takslet)。当我将sv2导出TASKLET的目的地更改为sv1时,问题就消失了。
但现在我面临两个模块必须相互导出符号的问题。我不知道如何解决这个问题......
两个 *.c 文件都在同一个目录中,我的 Makefile 有以下行:
obj-m += sv_publisher.o zsv_core.o
有没有人有一些提示如何去做?