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

bit*_*ter 3 macros kernel kernel-module linux-kernel

什么是使用宏象的需要module_init,并module_exit在写加载内核模块?另外,为什么我们使用像__init或等的MACRO __exit.即使我们可以在不使用它们的情况下完成工作.

  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.");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)

有什么不同?

ask*_*skb 5

module_{init,exit}() 在将模块文件加载到内核空间或从内核空间卸载模块文件时,添加必要的样板来初始化/清理模块并运行入口/出口代码.

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

请参阅Rubini和Corbet

"

在初始化完成后,属性__init将导致初始化函数被丢弃,并且其内存被回收.但是,它仅适用于内置驱动程序; 它对模块没有影响.相反,__exit会在驱动程序未构建为模块时导致省略标记的函数; 再次,在模块中,它没有任何影响.

使用__init(和__initdata用于数据项)可以减少内核使用的内存量.使用__init标记模块初始化函数没有任何害处,即使目前也没有任何好处.初始化部分的管理尚未针对模块实现,但它可能是未来的增强.

"