在编写可加载内核模块时,有必要使用像module_init
和module_exit
这样的MACRO吗?另外,我们为什么要使用__init
或__exit
等MACRO。即使我们可以在不使用它们的情况下完成工作。
没有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.");
}
使用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);
有什么区别?
答案 0 :(得分:5)
module_{init,exit}()
添加必要的样板来初始化/清理模块并运行入口/出口代码。
__init
告诉内核这个函数执行一次
永远不会回来主要是内置驱动程序,而module_init()
是在insmod时初始化模块。
“
属性__init,将导致初始化函数 在初始化之后被丢弃,并且它的内存被回收 完成。但是,它仅适用于内置驱动程序;它没有 对模块的影响。而__exit则导致遗漏标记 当驱动程序不是作为模块构建时的功能;再次,在模块中, 它没有效果。
使用__init(和__initdata用于数据项)可以减少 内核使用的内存量。标记没有害处 模块初始化函数使用__init,即使是当前 也没有任何好处。初始化部分的管理有 还没有为模块实现,但它可能是一种增强 为了将来。
“