2012-10-12 13 views
8

Çok basit bir dünya çekirdeği modülü yapıyorum ve bazı çılgın davranışlar alıyorum. Bu, 3.3.8 çekirdeğine yükseltilinceye kadar çalıştı ve şimdi ... Evet, çıkışta init işlevini çağırıyor ve exit işlevi başlatılıyor.Kernel Module Init and Exit işlevleri yanlış sırada çağrılıyor

kök @ cop4610: Ben isimleri doğru

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

Örnek çıktı emin yaptık /home/cop4610/Downloads/linux-3.3.8/mymodule# mymodule.ko kök insmod'a @ cop4610: /home/cop4610/Downloads/linux-3.3.8/mymodule# kuyruk/var/log/syslog Ekim 12 10:08:20 cop4610 çekirdek: [633,567832] Modül yüklenmemiş, bu printk

Aşağıdaki, bu mutluluktan bir video ening canlı: http://www.youtube.com/watch?v=8aJNSpCd7as&feature=youtu.be

+0

yükseltmenin ardından da modül için yeniden yaptık? –

+0

Çekirdek yükseltmesinden beri sıfırdan yeniden yükledim;) – Ben

+0

şimdi isteğe bağlı __init ve __exit maktadır? –

cevap

13

Yeni satır gerektirdi !!!!!! Arrggg !!!

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

ve O gerçekten bozuk onları yapmıyordu görünüyor

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

, sadece ikincisi tampon olarak verildiği kadar ilk görünmüyor çünkü, ortaya çıktı Kızarma değildi.

+1

Çözümü paylaştığınız için teşekkürler. Aynı problemi yaşıyordum ve şaşırdım. Cevabınızı gördükten sonra şimdi mantıklı. – russoue

+0

Çözümü paylaştığınız için teşekkür ederiz. – Midhun

1

Bu benim temel örnektir:

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

Benim temel Makefile:

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