8

He intentado portar pocos controladores de Linux y me di cuenta de que existe una diferencia sustancial entre la versión de kernel 2.4 y 2.6 de Linux.¿Cuál es la diferencia entre module_init e init_module en un módulo kernel de Linux?

En la versión 2.4 del kernel, la programación del módulo fue de la siguiente manera -

#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"); 
} 

Pero, con la versión 2.6 del kernel, el siguiente tiene que ser hecho por módulos -

#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); 

¿Cuál es la ventaja de tales cambios en Kernel 2.6 y por qué fue necesario ese cambio en kernel 2.6 de Linux?

+0

Las declaraciones 2.4 implican que nunca podría construir el módulo en el sistema (ya que las declaraciones no son estáticas). – stsquad

+1

Aquí hay una explicación muy buena para module_init: http://stackoverflow.com/questions/18605653/linux-module-init-vs-core-initcall-vs-early-initcall – user2311046

Respuesta

6

Si nos fijamos en la definición de las nuevas funciones:

/* 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))); 

verás que garantiza el derecho repetitivo se incluyen para estas funciones especiales se trata correctamente por el compilador. Es lo que hace la API interna de Linux, evoluciona si hay mejores formas de resolver el problema.

+0

Sí, pero ¿cómo es esto mejor? ¿camino? Las directivas son solo para hacer que el nombre de función proporcionado por el usuario se realice como un alias para la función te init_module() – Chethan

+0

Legibilidad, consistencia de API, aplicación de la convención. Por lo general, desea hacer que los componentes de la placa de la caldera de conformidad API sean difíciles de estropear y deje que el desarrollador se concentre en los problemas reales que necesita resolver. – stsquad

1

Una ventaja es la legibilidad. cdrom_init() instantáneamente le dice que es la llamada a init() para el controlador cdrom.

5

¿Cuál es la ventaja de [module_init] en Kernel 2,6

module_init también salieron en 2.4, que conste.

Agrega el texto repetido necesario para inicializar el módulo y ejecutar la función de entrada cuando el archivo del módulo se compila en el kernel en lugar de como un módulo.

Cuestiones relacionadas