在编写可加载内核模块时需要使用类似module_init和module_exit的MACROS

时间:2014-12-14 12:55:30

标签: macros linux-kernel kernel kernel-module

在编写可加载内核模块时,有必要使用像module_initmodule_exit这样的MACRO吗?另外,我们为什么要使用__init__exit等MACRO。即使我们可以在不使用它们的情况下完成工作。

  1. 没有MACROS

    /*
    Without using MACROS
    Author: Sricharan Chiruvolu
    Date: 14 Dec 2014
    */
    #include <linux/module.h>
    #include <linux/kernel.h>
    int init_module(void){
        printk(KERN_ALERT "This is our first program.");
        return 0;
    }
    void cleanup_module(void){
        printk(KERN_ALERT "End of our first program.");
    }
    
  2. 使用MACRO

    /* 
    Edited first.c; Added macros module_init and module_exit
    Author: Sricharan Chiruvolu
    Date: 14 Dec 2014
    */
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/init.h>
    
    static int __init first_init(void)
    {
        printk(KERN_ALERT "This is our first program.");
        return 0;
    }
    
    static void __exit first_exit(void)
    {
        printk(KERN_ALERT "End of our first program.");
    }
    
    module_init(first_init);
    module_exit(first_exit);
    
  3. 有什么区别?

1 个答案:

答案 0 :(得分:5)

当模块文件加载到内核空间或从内核空间卸载模块文件时,

module_{init,exit}()添加必要的样板来初始化/清理模块并运行入口/出口代码。

__init告诉内核这个函数执行一次 永远不会回来主要是内置驱动程序,而module_init()是在insmod时初始化模块。

Refer Rubini & Corbet

属性__init,将导致初始化函数 在初始化之后被丢弃,并且它的内存被回收 完成。但是,它仅适用于内置驱动程序;它没有 对模块的影响。而__exit则导致遗漏标记 当驱动程序不是作为模块构建时的功能;再次,在模块中, 它没有效果。

使用__init(和__initdata用于数据项)可以减少 内核使用的内存量。标记没有害处 模块初始化函数使用__init,即使是当前 也没有任何好处。初始化部分的管理有 还没有为模块实现,但它可能是一种增强 为了将来。