Module 在内核模块中导出TASKLET?

Module 在内核模块中导出TASKLET?,module,linux-kernel,linux-device-driver,embedded-linux,symbol-table,Module,Linux Kernel,Linux Device Driver,Embedded Linux,Symbol Table,我得到了两个内核模块,它们都使用EXPORT_SYMBOL()导出一些符号。 其中一个导出基本函数(sv1sv2) 我想要的是导出TASKLET。我在某个可能的地方读到过,而且没有禁止这样做的规定。模块nr 1(称为sv1)由BH函数和tasklet声明组成: struct tasklet_struct sv_takslet; EXPORT_SYMBOL(sv_takslet); void sv_tasklet_function( unsigned long data ) { printk

我得到了两个内核模块,它们都使用EXPORT_SYMBOL()导出一些符号。 其中一个导出基本函数(sv1sv2)

我想要的是导出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()函数:

问题是当我得到:

tasklet_schedule(&sv_takslet);
在我的代码中,我没有在列表中看到我的两个模块(modprobe-l),但当我在sv2上注释这一行时,它们神奇地出现了

这种行为的原因是什么?此初始化是否正确


编辑

此问题的原因是模块sv2在sv1之前加载,并且不了解tasklet(行:extern struct tasklet\u struct sv\u takslet)。当我更改sv2导出到sv1的TASKLET的目标时,问题就消失了

但是现在我面临的问题是,两个模块必须相互导出符号。我不知道如何解决这个问题

两个*.c文件位于同一目录中,我的Makefile有以下行:

obj-m += sv_publisher.o zsv_core.o

有人知道如何处理吗?

这种行为的原因是什么?
-内核空间中几乎任何不正确的操作都可能导致其他对象的数据损坏。您的tasklet使用模式似乎是正确的。导出符号与此问题没有任何共同之处。事实上,消除某些操作会清除可观察到的错误并不意味着其他操作是正确的。尝试调试模块的其他部分。
两个模块必须相互导出符号。
不能加载具有循环依赖关系的模块。您必须更改它,以便一个模块与另一个模块“注册”(和“取消注册”)某些接口(例如,包含数据和函数指针的结构)。
这种行为的原因是什么?
-内核空间中几乎任何不正确的操作都可能导致其他对象的数据损坏。您的tasklet使用模式似乎是正确的。导出符号与此问题没有任何共同之处。事实上,消除某些操作会清除可观察到的错误并不意味着其他操作是正确的。尝试调试模块的其他部分。
两个模块必须相互导出符号。
不能加载具有循环依赖关系的模块。您必须更改它,以便一个模块与另一个模块“注册”(和“取消注册”)一些接口(例如,包含数据和函数指针的结构)。
obj-m += sv_publisher.o zsv_core.o