Как определить функцию в одном модуле ядра Linux и использовать ее в другом? - PullRequest
10 голосов
/ 22 марта 2012

Я разработал два простых модуля для ядра. Теперь я хочу определить функцию в одном модуле, а затем использовать ее в другом.

Как я могу это сделать?

Просто определить функцию и вызывающего абонента в другом модуле без проблем?

Ответы [ 2 ]

29 голосов
/ 22 марта 2012

Определите его в module1.c:

#include <linux/module.h>

int fun(void);
EXPORT_SYMBOL(fun);

int fun(void)
{
    /* ... */
}

И используйте в module2.c:

extern int fun(void);
0 голосов
/ 09 апреля 2019

Ядро Linux допускает стек модулей, что в основном означает, что один модуль может использовать символы, определенные в других модулях.Но это возможно только тогда, когда символы экспортируются.Давайте воспользуемся очень простым модулем hello world.В этом модуле мы добавили функцию с именем «hello_export» и использовали макрос EXPORT_SYMBOL для экспорта этой функции.

hello_export.c

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); 
static int hello_init(void)
{ 
  printk(KERN_INFO "Hello,world");
   return 0; 
}
static hello_export(void) {
 printk(KERN_INFO "Hello from another module");
return 0;
} 
static void hello_exit(void) 
{ 
  printk(KERN_INFO "Goodbye cruel world"); 
} 
EXPORT_SYMBOL(hello_export);

module_init (hello_init);module_exit (hello_exit);Подготовьте Makefile, скомпилируйте его с помощью команды make, а затем вставьте его в ядро ​​с помощью insmod.$ insmod hello_export.ko Все символы, которые известны ядру, перечислены в / proc / kallsyms.Давайте поищем наш символ в этом файле.

$ cat / proc / kallsyms |grep hello_export d09c4000 T hello_export [hello_export]

Из результатов мы видим, что экспортированный нами символ указан в символах, распознаваемых ядром.

...