驱动模块主要包含头文件、模块参数(可选)、模块功能函数(可选)、模块加载和卸载函数以及模块许可声明等。这些模块组成具体作用如下:
1 头文件
驱动程序与内核联系十分密切,因此其所需的大多函数声明以及宏定义均来自内核,需要根据实际使用需求从内核中加入所需的头文件。驱动模块中有个必须的头文件如下:
#include // 包含了加载模块需要用到的符号和函数定义
#include // 包含了加载函数和卸载函数的宏定义
2 模块参数
模块参数非必选的,模块参数是模块在被加载时可传递参数值,这些参数对应内部的全局变量。
3 模块加载和卸载函数
通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核调用,完成模块的相关初始化工作。
通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块装载函数相反的功能。
4 模块许可声明
模块许可声明描述内核模块的许可权限,如果一个模块没有任何许可,模块被加载时,将会收到内核内污染(kernel tainted)的警告。内核可以识别的许可权限有如下:
MODULE_LICENSE("GPL"); // 任意版本的GNU公共许可权
MODULE_LICENSE("GPL v2"); // GPL版本2许可权
MODULE_LICENSE("GPL and additional rights"); // GPL及其附加许可权
MODULE_LICENSE("Dual BSD/GPL"); // BSD/GPL双重许可权
MODULE_LICENSE("Dual MPL/GPL"); // MPL/GPL双重许可权
MODULE_LICENSE("Proprietary"); // 专有许可权