Linux设备驱动程序为用户提供了使用系统设备的接口,可以编译为模块,也可以编译到内核源码中。一般情况下,采用编译为内核模块的方式。最简单的Linux设备驱动程序模块分为一下几个部分:
一:模块入口函数.
模块入口函数即模块初始化函数,在模块初始化时运行,负责注册模块所提供的,可以被应用程序访问的新功能.
模块入口函数的原型为: static int __init my_init(void). 其中的几个部分含义如下:
1.函数为static形式.
2.返回值为int.
3.__init表示该函数只在初始化期间使用,模块被装载以后,模块初始化函数即被模块装载器丢弃,这样可以释放该函书使用的内存.
4.my_init为入口函数的名称,可以任意命名.
5.void表示入口函数没有参量.
二: 模块出口函数.
模块出口函数负责本模块的清理工作,在模块被移除前注销模块接口并向系统返回所有资源,例如函数中动态分配的内存等.
模块出口函数的原型为: static void __exit my__exit(exit). 其中:
1.函数为static形式.
2.函数没有返回值.
3.__exit的含义与入口函数的__init类似,仅用于模块卸载,如果模块被直接嵌入内核,或者内核配置不允许卸载模块,则该函数被直接抛弃.
三.出口及入口函数的注册部分.
模块的出口及入口函数分别使用宏module_init()及module_exit().
入口函数注册:module_init(my_init),其中my_init为模块入口函数名.
出口函数注册:module_exit(my_exit),其中my_exit为模块出口函数名.
四.模块的版权及作者的声明等附加信息.
该部分使用一系列的宏实现.举例如下:
指定模块的版权,或使用的许可证:MODULE_LICNSE("GPL"),该声明表示使用了GPL许可证.
作者的声明:MODULE_AUTHOR("AUTHOR_NAME"),""内部为作者姓名.
五.模块所需的头文件.
这也是不可缺少的一部分,最基本的头文件应该包括一下几个:
#include 模块相关.
#include 程序调度相关.
这仅仅是最最简单的设备驱动模块函数,但也是最基本的架构.
阅读(785) | 评论(0) | 转发(0) |