Quelle est la différence entre module_init et init_module dans un module du noyau Linux?

J'ai essayé de port peu de pilotes pour linux et a réalisé qu'il existe une grande différence entre la version du noyau 2.4 et 2.6 de linux.

Dans la version 2.4 du noyau, le module de programmation est comme ci-dessous -

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

Mais, avec la version 2.6 du noyau, le suivant doit être fait pour les modules -

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

Quel est l'avantage de ces changements dans le Noyau 2.6 et Pourquoi était-ce le changement requis dans le noyau 2.6 de linux ?

Le 2.4 déclarations impliquent que vous ne pourrait jamais construire le module dans le système (comme les déclarations ne sont pas statiques).
Voici une très belle explication de module_init: stackoverflow.com/questions/18605653/...

OriginalL'auteur Karthik Balaguru | 2010-07-10