首页 文章

内核模块Init和Exit函数的调用顺序错误

提问于
浏览
8

我'm making a very simple hello world kernel module and getting some crazy behavior. This worked until I upgraded to kernel 3.3.8 and now it... Well, it'在退出时调用 init 函数,在初始化时调用 exit 函数 . 我确保我的名字是正确的

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

样本输出:

root @ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule#insmod mymodule.ko root @ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule#tail / var / log / syslog 10月12日10:08:20 cop4610内核:[633.567832]模块已卸载,这是printk

以下是现场直播的视频:http://www.youtube.com/watch?v=8aJNSpCd7as&feature=youtu.be

2 回答

  • 1

    它需要换行!!!!!! Arrggg!

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

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

    它似乎并没有真正按顺序执行,它只是出现了,因为第一个没有出现,直到第二个发布,因为缓冲区没有刷新 .

  • 15

    这是我的基本例子:

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

    我的基本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
    

相关问题