В чем разница между module_init и init_module в модуле ядра Linux? - PullRequest
11 голосов
/ 10 июля 2010

Я пытался портировать несколько драйверов linux и понял, что есть существенная разница между ядром версии 2.4 и 2.6 linux.

В версии ядра 2.4, программирование модуля было таким, как показано ниже -

#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)      
{ 
printk(KERN_INFO "Hi \n"); 
return 0; 
}

void cleanup_module(void)  
{ 
printk(KERN_INFO "Bye \n"); 
}

Но в версии ядра 2.6 для модулей необходимо сделать следующее:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int hi_init(void)
{
    printk(KERN_ALERT "Hi \n");
    return 0;
}

static void hi_exit(void)
{
    printk(KERN_ALERT "Bye \n");
}

module_init(hi_init);
module_exit(hi_exit);

В чем преимущество таких изменений в ядре 2.6 и почему это изменение потребовалосьв ядре 2.6 linux?

Ответы [ 3 ]

7 голосов
/ 10 июля 2010

Если вы посмотрите на определение новых функций:

/* Each module must use one module_init(). */
#define module_init(initfn)                 \
static inline initcall_t __inittest(void)       \
{ return initfn; }                  \
int init_module(void) __attribute__((alias(#initfn)));

/* This is only required if you want to be unloadable. */
#define module_exit(exitfn)                 \
static inline exitcall_t __exittest(void)       \
{ return exitfn; }                  \
void cleanup_module(void) __attribute__((alias(#exitfn)));

Вы увидите, что это гарантирует, что правильный шаблон включен, так что эти специальные функции могут корректно обрабатываться компилятором.Это то, что делает внутренний API Linux, он развивается, если есть лучшие способы решения проблемы.

5 голосов
/ 21 ноября 2010

В чем преимущество [module_init] в ядре 2.6

module_init, также вышло в 2.4, заметьте.

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

1 голос
/ 11 июля 2010

Одним из преимуществ является удобочитаемость.cdrom_init () мгновенно сообщает вам, что это вызов init () для драйвера cdrom.

...