C语言中的模块是什么?

时间:2018-12-03 07:53:58

标签: c linux-kernel

一个类似的问题已经出现在C ++上了一次,但是答案和问题本身并没有真正令人满意。
我读过.c Filegithub link),其中包括<linux/module.h>,并将其静态函数传递给module_init(foo)module_exit(foo)。 那么,模块,<linux/module.h> file在这种情况下,尤其是这两种方法的通用目的是什么?

2 个答案:

答案 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);