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?
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
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