Экспорт 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

У кого-нибудь есть советы, как это сделать?

0 ответов

Другие вопросы по тегам