Все модули ядра работают в одном и том же адресном пространстве.Чтобы вызвать один модуль из другого, вам необходимо экспортировать некоторые символы: функции или глобальные переменные.Хотя, вероятно, использование глобальных переменных в этом случае - плохой стиль.Обратите внимание, что ваши экспортированные символы будут в том же пространстве имен, что и все другие символы ядра.Чтобы избежать конфликтов имен, вы должны использовать для них какой-то четко определенный префикс, обычно это имя модуля и подчеркивание.Поэтому, если один из ваших модулей называется foo
, и вы хотите экспортировать функцию bar()
, вы можете использовать такой код в модуле foo
:
void foo_bar(const char *prm) {
printk (KERN_INFO "foo_bar(%s) was called\n", prm);
}
EXPORT_SYMBOL(foo_bar);
В другом модуле, скажем, buz,просто вызовите эту функцию:
foo_bar("qux");
Обратите внимание , что в модуле ядра вы не можете использовать функции libc (или других библиотек) и многие обычные вещи, такие как управление памятью, файл I/ O, работа в сети и так далее, может быть очень сложной.Также обратите внимание, что отладка модуля ядра не является тривиальной задачей, и многие ошибки вызовут панику ядра вместо безвредной ошибки сегментации.
Так что подумайте трижды, прежде чем перемещать какую-то рабочую библиотеку в пространство ядра.Возможно, было бы лучше разбить вашу библиотеку на те же «модули», но оставить ее (или большую ее часть) в пространстве пользователя.