gpt4 book ai didi

macros - 在编写可加载内核模块时需要使用 module_init 和 module_exit 等宏

转载 作者:行者123 更新时间:2023-12-02 05:19:43 25 4
gpt4 key购买 nike

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

  1. 没有宏

     /*
    Without using MACROS
    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. 使用宏

     /* 
    Edited first.c; Added macros module_init and module_exit
    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);

有什么区别?

最佳答案

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

__init 告诉内核该函数被执行一次并且never come back主要是针对内置驱动,而module_init()是在insmod时初始化模块。

Refer Rubini & Corbet

"

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

使用 __init(以及数据项的 __initdata)可以减少内核使用的内存量。标记没有坏处使用 __init 进行模块初始化函数,即使当前也没有什么好处。初始化部分的管理有尚未针对模块实现,但这是一个可能的增强为了 future 。

"

关于macros - 在编写可加载内核模块时需要使用 module_init 和 module_exit 等宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com