8

Ich habe versucht, einige Linux-Treiber zu portieren und erkannte, dass es einen wesentlichen Unterschied zwischen Kernel-Version 2.4 und 2.6 von Linux gibt.Was ist der Unterschied zwischen module_init und init_module in einem Linux-Kernel-Modul?

In der 2.4 Version des Kernels, die Modulprogrammierung, wie unten war -

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

Aber mit der Version 2.6 des Kernels, hat die folgenden für Module durchgeführt werden -

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

Was ist der Vorteil solcher Änderungen in Kernel 2.6 und warum wurde diese Änderung in Kernel 2.6 von Linux benötigt?

+0

Die 2.4 Deklarationen implizieren, dass Sie das Modul niemals in das System einbauen können (da die Deklarationen nicht statisch sind). – stsquad

+1

Hier ist eine sehr schöne Erklärung zu module_init: http://stackoverflow.com/questions/18605653/linux-module-init-vs-core-initcall-vs-e-arly-initcall – user2311046

Antwort

6

Wenn Sie bei der Definition der neuen Funktionen aussehen:

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

Sie werden sehen, es die richtigen vorformulierten gewährleistet ist im Preis inbegriffen, so dass diese Sonderfunktionen korrekt vom Compiler behandelt. Es ist, was die interne API von Linux tut, es entwickelt sich, wenn es bessere Möglichkeiten gibt, das Problem zu lösen.

+0

Ja, aber wie ist das ein besser Weg? Die Anweisungen dienen lediglich dazu, den vom Benutzer bereitgestellten Funktionsnamen als Alias ​​für die Funktion init_module() zu definieren. – Chethan

+0

Lesbarkeit, Konsistenz der API, Durchsetzung der Konvention. Im Allgemeinen möchten Sie, dass die Teile mit der API-Konformität der Kesselplatte schwer zu vermasseln sind und den Entwickler verlassen, um sich auf die wirklichen Probleme zu konzentrieren, die sie lösen müssen. – stsquad

1

Ein Vorteil ist die Lesbarkeit. cdrom_init() sagt Ihnen sofort, dass es der init() - Aufruf für den CD-ROM-Treiber ist.

5

Was den Vorteil von [module_init] in Kernel ist 2,6

module_init auch in 2.4 verlassen, wohlgemerkt.

Es fügt den notwendigen Textbaustein hinzu, um das Modul zu initialisieren und die Eingabefunktion auszuführen, wenn die Moduldatei in den Kernel und nicht als Modul kompiliert wird.