一个类似的问题已经出现在C ++上了一次,但是答案和问题本身并没有真正令人满意。
我读过.c File
(github link),其中包括<linux/module.h>
,并将其静态函数传递给module_init(foo)
和module_exit(foo)
。
那么,模块,<linux/module.h> file
在这种情况下,尤其是这两种方法的通用目的是什么?
答案 0 :(得分:4)
它用于Linux Kernel Module。第1.1节提到:
因此,您想编写一个内核模块。 [..]现在您想进入 真正的作用在哪里,内核模块到底是什么?模组 是可以加载和卸载到内核中的代码段 根据要求。它们扩展了内核[..]的功能。对于 例如,一种类型的模块是设备驱动程序,它允许 内核访问连接到系统的硬件。
然后,在第2.3节中:
宏
module_init()
和module_exit()
宏会初始化并清理函数。
示例:
module_init(hello_2_init);
module_exit(hello_2_exit);
这两个dymmy函数都调用printk();
,向世界打招呼/再见。
在3.1.1节中:
模块始终以
init_module()
或您通过module_init()
调用指定的函数开头。 这是用于 模块;它告诉内核模块提供了什么功能,并设置了内核以在需要时运行模块的功能。所有模块均以调用
cleanup_module()
或函数结尾 您可以通过module_exit()
调用来指定。 这是退出功能 用于模块;它会撤消任何入口函数的作用。它取消注册 入口功能注册的功能。
答案 1 :(得分:1)
这是特定于Linux操作系统内核(模块)编程的,而不是一般的C / C ++编程,我们可以说这有点类似于或类似于开发Linux内核程序的某些框架。
Linux操作系统内核支持向内核中动态添加程序或从内核中删除程序。这些API用于编写此类内核程序(通常称为模块)。
因此,当您尝试将模块插入内核时会调用module_init(),而当我们在完成其工作后删除模块时,会调用model_exit()进行清理。
以下是您可以尝试的最简单的内核模块
#include "linux/init.h" /*(use angle brackets here if it doesn't work)*/
#include "linux/module.h"
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_ALERT "Hello good try keep it up\n");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT "Goodbye .. take care\n");
}
module_init(hello_init);
module_exit(hello_exit);