Экспорт TASKLET в модуль ядра?
Я получил два модуля ядра, которые оба экспортируют некоторые символы, используя EXPORT_SYMBOL(). Один из них экспортирует базовую функцию (sv1 <-sv2), и она работает, но у меня возникла проблема с другой (sv1-> sv2).
Что я хочу, так это экспортировать ТАСКЛЕТ. Я где-то читал, что это возможно, и нет никаких запретов на это. Модуль № 1 (называемый sv1) состоит из функции BH и объявления тасклета:
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), но когда я комментирую эту строку в sv2 - они волшебным образом появляются.
Что может быть причиной такого поведения? Это правильная инициализация?
РЕДАКТИРОВАТЬ
Причиной этой проблемы является то, что модуль sv2 загружается до sv1 и не знает о тасклете (строка: extern struct tasklet_struct sv_takslet). Когда я меняю пункт назначения, что sv2 экспортирует TASKLET в sv1, проблема исчезает.
Но теперь я сталкиваюсь с тем, что оба модуля должны экспортировать символы друг в друга. Я понятия не имею, как решить эту проблему...
Оба *.c файла находятся в одном каталоге, и мой Makefile имеет следующую строку:
obj-m += sv_publisher.o zsv_core.o
У кого-нибудь есть советы, как это сделать?