2012-10-12 3 views
8

Sto facendo un semplice modulo hello world kernel e sto facendo un pazzo comportamento. Questo ha funzionato fino a quando non ho aggiornato il kernel 3.3.8 e ora ... Beh, chiama la funzione init all'uscita e la funzione exit al momento dell'inizializzazione. Ho fatto in modo che i miei nomi sono corretti uscitaLe funzioni Init ed Exit del modulo Kernel vengono chiamate nell'ordine errato

// Needed for module definitions 
#include <linux/module.h> 
// Needed for initilization modules 
#include <linux/init.h> 

// Must declare some license 
MODULE_LICENSE("Dual BSD/GPL"); 

// Function to be called on insmod 
// Returns 0 on success 
static int __init mymod_init(void) 
{ 
     // Prints kernel alert. Check /var/log/syslog 
     printk(KERN_ALERT "Module was loaded, this is the printk."); 

     return 0; 
} 

// Function to be called on rmmod 
static void __exit mymod_exit(void) 
{ 
     // Prints kernel alert. Check /var/log/syslog 
     printk(KERN_ALERT "Module was unloaded, this is the printk"); 
} 

// Register these functions 
module_init(mymod_init); 
module_exit(mymod_exit); 

Esempio:

root @ cop4610: /home/cop4610/Downloads/linux-3.3.8/mymodule# insmod radice mymodule.ko @ cop4610: /home/cop4610/Downloads/linux-3.3.8/mymodule# tail/var/log/syslog 12 ottobre 10:08:20 kernel cop4610: [633.567832] Il modulo è stato scaricato, questa è la stampante

Quello che segue è un video di questo happ ening live: http://www.youtube.com/watch?v=8aJNSpCd7as&feature=youtu.be

+0

hai fatto ricostruire per il modulo dopo l'aggiornamento? –

+0

L'ho rifatto da zero dall'aggiornamento del kernel;) – Ben

+0

sono __init e la macro __exit ora è facoltativa? –

risposta

13

Aveva bisogno di una nuova linea !!!!!! Arrggg !!!

printk(KERN_ALERT "Module was unloaded, this is the printk\n"); 

e

printk(KERN_ALERT "Module was loaded, this is the printk\n"); 

Sembra non è stato realmente facendo li fuori uso, semplicemente sembrava, perché il primo non è stato mostrando fino al secondo è stato rilasciato come il buffer non è stato lavato.

+1

Grazie per aver condiviso la soluzione. Stavo avendo lo stesso problema ed ero perplesso. Ha senso ora dopo aver visto la tua risposta. – russoue

+0

Grazie per aver condiviso la soluzione. – Midhun

1

Questo è il mio esempio di base:

#include <linux/module.h> 
#include <linux/kernel.h> 

#define MODULE_NAME "hello_md" 

MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("B3h3m0th"); 
MODULE_DESCRIPTION("Basic LKM; hello world module"); 
MODULE_VERSION("0.0"); 

static int __init insert_mod(void) 
{ 
    printk(KERN_ALERT "[%s] Init: \"Hello World\"\n", MODULE_NAME); 
    return 0; 
} 


static void __exit remove_mod(void) 
{ 
    printk(KERN_ALERT "[%s] Exit\n", MODULE_NAME); 
} 

module_init(insert_mod); 
module_exit(remove_mod); 

mio Makefile di base:

obj-m += basic_module.o 

KERNELVERSION = $(shell uname -r) 

all: 
    $(MAKE) -C /lib/modules/$(KERNELVERSION)/build M=$(PWD) modules 
clean: 
    $(MAKE) -C /lib/modules/$(KERNELVERSION)/build M=$(PWD) clean