概述
驱动学习(二)模块传参
文章目录
- 驱动学习(二)模块传参
- 概念
- 实操
概念
-
应用程序传参是通过shell终端传,应用程序接收传参:int main(int argc ,char *argv[])
-
驱动程序通过shell终端给驱动中的参数赋实参值,驱动程序通过声明后的全局变量接收参数
模块传参用到以下函数
module_param(name,type,perm)声明函数
name:参数名,既是外部参数名,又是内部参数名
type:参数的数据类型。
byte, short, ushort, int, uint, long, ulong
charp: a character pointer
bool: a bool, values 0/1, y/n, Y/N.
invbool: the above, only sense-reversed (N = true).
perm:访问权限。八进制,如:0777。0表示该参数在文件系统中不可见。
本质是宏函数,调用了module_param_named(name, name, type, perm)
#define module_param(name, type, perm)
module_param_named(name, name, type, perm)
module_param_string(name,string,len,perm)
name:参数名,外部参数名
string:内部参数名(内部字符数组名)
len:数组长度
perm:访问权限,0644。0表示该参数在文件系统中不可见
module_param_array(name,type,nump,perm)
name:数组参数名,既是外部参数,又是内部参数
type:参数的数据类型
nump:终端传给数组的实际元素个数(指针变量)
perm:访问权限,0644。0表示该参数在文件系统中不可见
实操
- 代码编写
1 #include <linux/module.h>
2
3 int test = 1;
4
5 int driver_init(void)
6 {
7 printk("**************test init value %drn",test);
8 return 0;
9 }
10
11
12 void driver_clear(void)
13 {
14 printk("***************test clear value %drn",test);
15 }
16
17 MODULE_LICENSE("GPL");
18 MODULE_AUTHOR("cfy");
19 MODULE_ALIAS("liangzai");
20 MODULE_DESCRIPTION("2022-7-5");
21
22 module_param(test,int,0666);
23 module_init(driver_init);
24 module_exit(driver_clear);
- Makefile内容
1 ifeq ($(KERNELRELEASE),)
2 KERNELDIR ?=/lib/modules/$(shell uname -r)/build
3 PWD := $(shell pwd)
4 modules:
5 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
6 else
7 obj-m :=module_param.o
8 endif
9
10 clean:
11 rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
- 编译
编译出错了,查询后发现是**__ATTR**宏的权限问题,将上述的0666改为0664,问题解决。具体参考了https://blog.csdn.net/Q1302182594/article/details/53558192。
重新编译
安装驱动模块并传参、查看打印信息
测试module_param_string、module_param_arr
代码编写
1 #include <linux/module.h>
2 #define BUF_SIZE 10
3
4 int test = 1;
5 int count = 0;
6 char test_str[BUF_SIZE]={0};
7 int test_arr[BUF_SIZE]={0};
8
9 int driver_init(void)
10 {
11 int i = 0;
12 printk("**************test init value %drn",test);
13 printk("**************test_str %s rn",test_str);
14 for(;i < count;i++)
15 {
16 printk(" %d ",test_arr[i]);
17 }
18 printk("n");
19 return 0;
20 }
21
22 void driver_clear(void)
23 {
24 int i = 0;
12 printk("**************test init value %drn",test);
13 printk("**************test_str %s rn",test_str);
14 for(;i < count;i++)
15 {
16 printk(" %d ",test_arr[i]);
17 }
18 printk("n");
25 }
26
27 MODULE_LICENSE("GPL");
28 MODULE_AUTHOR("cfy");
29 MODULE_ALIAS("liangzai");
30 MODULE_DESCRIPTION("2022-7-5");
31
32 module_param(test,int,0664);
33 module_param_string(str,test_str,BUF_SIZE,0664);
34 module_param_array(test_arr,int,&count,0644);
35
36 module_init(driver_init);
37 module_exit(driver_clear);
编译、安装、传参
-
此外还可以在文件系统中修改参数
cd /sys/module/module_param/parameters
在/sys/module/目录下,进入自己安装的驱动模块目录下,例如我此时安装的驱动模块是module_param,进入此目录,再进入parameters目录下,就可以看到定义的全局变量
通过vim编辑器修改变量
卸载驱动模块并查看内核打印信息(验证文件系统修改变量是否成功)
修改成功,模块传参验证完毕!接下来是符号导出
最后
以上就是机智小懒猪为你收集整理的驱动学习(二)模块传参的全部内容,希望文章能够帮你解决驱动学习(二)模块传参所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复