目录
1.1、加载模块命令
1.1.1、insmod
1.1.2、modprobe
1.2、卸载模块命令
1.3、查看加载模块
1.4、查看模块信息
2、操作
2.1、module_init()
2.2、module_exit()
2.3、MODULE_LICENSE()
2.4、MODULE_AUTHOR()
2.5、MODULE_DEscriptION()
2.6、MODULE_ALIAS()
3、模块参数
3.1、MODULE_PARM_DESC(variable, description)
3.2、MODULE_PARM(variable, type)
3.3、module_param_named(name, variable, type, perm)
3.4、module_param(name, type, perm)
3.5、module_param_string(name, string, len, perm)
3.6、module_param_array_named(name, array, type, nump, perm)
3.7、module_param_array(name, type, nump, perm)
4、模块编译Makefile
Linux 驱动有两种运行方式。
1)第将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。
2)将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用加载命令加载驱动模块。
1.1、加载模块命令
1.1.1、insmod
最简单的模块加载命令,此命令用于加载指定的.ko 模块。
注:insmod 命令不能解决模块的依赖关系。
1.1.2、modprobe
modprobe会分析模块的依赖关系(模块之间的依赖关系放在/lib/modules/
注:当modprobe 提示无法打开“modules.dep”这个文件时,输入 depmod命令将自动生成modules.dep(输入“depmod”命令以后会生成 modules.alias、modules.symbols 和 modules.dep)。
1.2、卸载模块命令
| rmmod | 用于卸载指定的.ko模块 |
| modprobe -r | 使用 modprobe 命令可以卸载掉驱动模块所依赖的其他模块,前提是这些依赖模块已经没有被其他模块所使用,否则就不能使用 modprobe 来卸载驱动模块。 |
1.3、查看加载模块
1)lsmod
2)cat /proc/modules
3) 内核已经加载的模块的信息也存在于/sys/module目录下(模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录)
1.4、查看模块信息
modinfo
2、操作
#include //所有模块都需要的头文件
#include // init和exit相关宏
2.1、module_init()
用来向 Linux 内核注册一个模块加载函数,参数 xxx_init 为驱动入口函数,当加载驱动的时候 xxx_init函数就会被调用。
module_init(xxx_init); //注册模块加载函数
注:驱动入口函数使用“__init”来修饰。
static int __init xxx_init(void);
2.2、module_exit()
用来向 Linux 内核注册一个模块卸载函数,参数xxx_init 为驱动入口函数,当加载驱动的时候 xxx_init函数就会被调用。
module_exit(xxx_exit); //注册模块卸载函数
注:驱动出口函数使用“__exit”来修饰。
static void __exit xxx_exit(void);
2.3、MODULE_LICENSE()
添加模块 LICENSE 信息。
MODULE_LICENSE("GPL");
2.4、MODULE_AUTHOR()
添加模块作者信息。
MODULE_AUTHOR("author");
2.5、MODULE_DEscriptION()
添加模块描述信息。
MODULE_DEscriptION("description");
2.6、MODULE_ALIAS()
添加模块别名。
MODULE_ALIAS("alias");
3、模块参数
对于如何向模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。
insmod module.ko [param1=value param2=value ...]
使用下面的宏时需要包含头文件(include/linux/moduleparam.h)。
注:宏不会声明变量,因此在使用宏之前,必须声明变量。
3.1、MODULE_PARM_DESC(variable, description)
对参数进行描述说明。
3.2、MODULE_PARM(variable, type)
老版本内核使用的MODULE_PARM宏,新版本改为module_param或者module_param_array等。
参数 variable:变量
参数 type:变量类型。的格式为 [min[-max]]{b,h,i,l,s} 字符串,其中 min 和 max 是数组的长度限度(如果两者都忽略了,则默认为 1)。最后一个字符是类型说明符:
| b | byte |
| h | short |
| i | int |
| l | long |
| s | string |
3.3、module_param_named(name, variable, type, perm)
参数 name:外部可见的参数名
参数 variable:源文件内部的全局变量名
参数 type:变量的数据类型,byte, short, ushort, int, uint, long, ulong, charp, bool, invbool; 注: invbool 类型颠倒了值, 所以真值变成 false,假值变成true。
参数 perm:访问参数的权限,当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点(即 /sys/module/模块/parameters/变量)。
注:如果模块参数是一个字符串时,通常使用charp类型定义这个模块参数。内核复制用户提供的字符串到内存,并且相对应的变量指向这个字符串。
3.4、module_param(name, type, perm)
源文件内部的变量名与外部的参数名相同
#define module_param(name, type, perm)
module_param_named(name, name, type, perm)
3.5、module_param_string(name, string, len, perm)
内核把字符串直接复制到程序中的字符数组内。
参数 name:外部的参数名
参数 string:内部的变量名
参数 len:是以string命名的buffer大小
参数 perm:访问参数的权限,
3.6、module_param_array_named(name, array, type, nump, perm)
参数 name:外部模块的参数名
参数 array:程序内部的变量名
参数 type:数据类型
参数 nump:指向一个整数,其值表示有多少个参数存放在数组name中(name数组必须使用static静态分配)。
参数 perm是sysfs的访问权限。
3.7、module_param_array(name, type, nump, perm)
源文件内部的变量名与外部的参数名相同。



