模块(加载函数和卸载函数)
来源:互联网 发布:程序员专业术语 编辑:程序博客网 时间: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);
- 模块(加载函数和卸载函数)
- 模块加载和卸载函数
- Linux内核模块的“加载”和“卸载”函数
- 内核模块基础知识(加载/卸载函数/许可证/)
- 模块加载和卸载
- LDD3笔记——scull模块加载与卸载函数
- ERROR: Removing 'hello': Device or resource busy //关于使用系统定义的模块加载和卸载函数
- 视图控制器加载和卸载时的几个函数
- md模块浅谈(一)加载和卸载
- 内核模块的加载和卸载
- linux 编译和加载卸载模块
- .ko模块的加载和卸载
- linux模块加载和模块卸载时出现的问题
- Erlang -模块和函数
- 3. 函数和模块
- 帧缓冲设备驱动的模块加载/卸载及平台驱动的探测/移除函数的模板
- Linux内核模块的编译、加载和卸载
- 内核模块编写,编译,加载和卸载过程
- STM8、32 库函数自动生成器
- log4j2 日志配置
- linuc c网络
- 上机题目(中级)- 用小数形式输出指定符号出现的频率 (Java)
- 第一次写博客,先上传一下平常开发android的时候做的一点笔记
- 模块(加载函数和卸载函数)
- Android笔记
- mysql数据类型
- iOS开发技巧(系列十三:UIRefreshControl下拉刷新)
- Linux系统crontab 定时任务 补充
- javascript 类,只读属性,闭包
- js 字符串 replace replaceAll
- Java学习笔记(60)----------8张图理解Java
- Objective-C @property学习总结3 完结