Macros 在编写可加载内核模块时需要使用诸如module_init和module_exit之类的宏

Macros 在编写可加载内核模块时需要使用诸如module_init和module_exit之类的宏,macros,linux-kernel,kernel,kernel-module,Macros,Linux Kernel,Kernel,Kernel Module,在编写可加载的内核模块时,需要使用诸如module\u init和module\u exit之类的宏吗?另外,我们为什么要使用诸如\uuu init或\uu exit之类的宏呢。即使我们不用它们也能完成任务 没有宏 /* Without using MACROS Author: Sricharan Chiruvolu Date: 14 Dec 2014 */ #include <linux/module.h> #include <linux/kernel.h> int i

在编写可加载的内核模块时,需要使用诸如
module\u init
module\u exit
之类的宏吗?另外,我们为什么要使用诸如
\uuu init
\uu exit
之类的宏呢。即使我们不用它们也能完成任务

  • 没有宏

    /*
    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.");
    }
    
    /*
    不使用宏
    作者:Sricharan Chiruvolu
    日期:2014年12月14日
    */
    #包括
    #包括
    int init_模块(void){
    printk(KERN_ALERT“这是我们的第一个程序”);
    返回0;
    }
    空洞清理_模块(空洞){
    printk(KERN_ALERT“我们的第一个程序结束”);
    }
    
  • 使用宏

    /* 
    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);
    
    /*
    第一次编辑,c;添加了宏module_init和module_exit
    作者:Sricharan Chiruvolu
    日期:2014年12月14日
    */
    #包括
    #包括
    #包括
    静态int\uu init first\u init(void)
    {
    printk(KERN_ALERT“这是我们的第一个程序”);
    返回0;
    }
    静态无效\uuu退出第一个\u退出(无效)
    {
    printk(KERN_ALERT“我们的第一个程序结束”);
    }
    模块_init(第一个_init);
    模块退出(第一个退出);
    
  • 区别是什么?

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

    \uuu init
    告诉内核这个函数执行一次又一次 当
    module\u init()
    在insmod时初始化模块时,不要主要针对内置驱动程序返回

    "

    属性_init将导致初始化函数 在初始化后被丢弃,并回收其内存 完整。但是,它只对内置驱动程序有效;它没有 对模块的影响。相反,退出会导致省略标记的 当驱动程序不是作为模块构建时,该函数;同样,在模块中, 它没有效果

    使用_init(和数据项的_initdata)可以减少 内核使用的内存量。标记没有坏处 模块初始化功能使用_init,即使当前 这也没有任何好处。初始化部分的管理已经完成 模块尚未实现,但这是一个可能的增强 为了未来