Каково различие между module_init и init_module в модуле ядра Linux?

Я пытался портировать немного драйверов 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?

11
задан Ciro Santilli 新疆改造中心法轮功六四事件 14 May 2017 в 08:51
поделиться

2 ответа

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

/* 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, он развивается, если есть лучшие способы решения проблемы.

7
ответ дан 3 December 2019 в 08:53
поделиться

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

1
ответ дан 3 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: