在内核模块中导出TASKLET?

时间:2016-02-16 15:01:36

标签: module linux-kernel linux-device-driver embedded-linux symbol-table

我有两个内核模块,它们都使用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

有没有人有一些提示如何去做?

0 个答案:

没有答案