模块(加载函数和卸载函数)

来源:互联网 发布:程序员专业术语 编辑:程序博客网 时间:2024/05/16 12:59


Linux模块是一些代码的集成,可以在启动系统后动态链接到内核的一部分,一旦载入之后就和内核没有什么区别,可以使内核崩溃。当不需要这些模块时,又可以断开链接将其删除。Linux的模块可以用C语言来编写,用gcc来编译生成目标文件(不进行链接,作为*.o文件存在),为此需要在gcc命令里加入-c的参数。由于不进行链接,gcc只允许一个输入文本,因此一个模块的所有部分都必须在一个文件中实现。


当编写模块时,必须提供两个函数,一个是int init_moudule(void),insmod在加载此模块的时候自动调用,负责模块的初始化工作。函数返回0,则初始化成功,返回负数,则失败。另一个函数是void cleanup_module(void),在模块在被卸载时调用,负责进行设备驱动程序的清除工作。


#define MODULE

#include<linux/module.h>

int init_module(void)

{

  printk(“Hello,world!\n”);

return 0;

}


void cleanup_module(void)

{

  Printk(“Goodbye cruel world!\n”);

}


#define MODULE首先明确这是一个模块,任何一个模块程序的编写都要包含一个linux/module.h这个头文件,这个文件包含了对模块的结构定义以及对模块版本的控制。

printk函数的功能与printf相似,只能由内核例程调用,用户态程序则需要调用printf来完成打印


#gcc –c hello.c –DMODULE –D_KERNEL_-DLINUX –WALL –O2 –I/usr/src/linux-2.4/include


这里编译用了一个-I开关,意思是编译时利用/usr/src/linux-2.4/include中的头文件,而不是/usr/include中的头文件,这两个目录下的头文件是不一样的,前者用于开发内核模块,后者拥有开发应用程序。如果两个文件内容是一样的,则可以不用-I这个开关。

后来Linux提供了两个宏module_init()module_exit()来显式地命名模块的加载函数和卸载函数,通常在源文件的末尾加上这两个函数。则程序可以改为:


#define MODULE

#include<linux/module.h>

int hello_init(void)

{

  printk(“Hello,world!\n”);

return 0;

}


void hello_exit(void)

{

  Printk(“Goodbye cruel world!\n”);

} 


module_init(hello_init);

module_exit(hello_exit);





0 0
原创粉丝点击