栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux驱动-模块

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux驱动-模块

目录

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//modules.dep中),然后会将所有的依赖模块都加载到内核中(modprobe 命令默认会去/lib/modules/目录中查找模块)。modprobe 命令能进行模块的依赖性分析、错误检查、错误报告等功能。

注:当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)。最后一个字符是类型说明符:

bbyte
hshort 
iint 
llong 
sstring

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)

源文件内部的变量名与外部的参数名相同。

4、模块编译Makefile
KERNELDIR := "Linux内核源码路径"
CURRENT_PATH := $(shell pwd)
obj-m := "要编译成模块的源文件"

build: kernel_modules

kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号