8

Ho cercato di portare alcuni driver linux e mi sono reso conto che c'è una sostanziale differenza tra la versione 2.4 e 2.6 di Linux.Qual è la differenza tra module_init e init_module in un modulo del kernel Linux?

Nella versione 2.4 del kernel, la programmazione del modulo è stato, come di seguito -

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

Ma, con la versione 2.6 del kernel, il seguente deve essere fatto per i moduli -

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

Qual è il vantaggio di tali cambiamenti nel kernel 2.6 e perché è stata necessaria tale modifica nel kernel 2.6 di linux?

+0

Le dichiarazioni 2.4 implicano che non è mai possibile creare il modulo nel sistema (poiché le dichiarazioni non sono statiche). – stsquad

+1

Ecco una spiegazione molto buona a module_init: http://stackoverflow.com/questions/18605653/linux-module-init-vs-core-initcall-vs-early-initcall – user2311046

risposta

6

Se si guarda la definizione delle nuove funzioni:

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

vedrete che assicura la giusta boilerplate è incluso in modo queste funzioni speciali possono correttamente trattata dal compilatore. È ciò che fa l'API interna di Linux, si evolve se ci sono modi migliori per risolvere il problema.

+0

Sì, ma come è questo un migliore modo? Le direttive servono solo a rendere il nome della funzione fornita dall'utente come alias per la funzione init_module() – Chethan

+0

Leggibilità, coerenza dell'API, convenzione di applicazione. In generale, si desidera che i bit della piastra della caldaia della conformità alle API siano difficili da rovinare e lasciare lo sviluppatore a concentrarsi sui problemi reali che devono essere risolti. – stsquad

1

Un vantaggio è la leggibilità. cdrom_init() ti dice istantaneamente che è la chiamata init() per il driver cdrom.

5

Qual è il vantaggio di [module_init] nel kernel 2,6

module_init usciti anche in 2.4, intendiamoci.

Aggiunge il boilerplate necessario per inizializzare il modulo ed eseguire la funzione di ingresso quando il file del modulo viene compilato nel kernel piuttosto che come un modulo.

Problemi correlati