我是靠谱客的博主 机智小懒猪,最近开发中收集的这篇文章主要介绍驱动学习(二)模块传参,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

驱动学习(二)模块传参

文章目录

      • 驱动学习(二)模块传参
          • 概念
          • 实操

概念
  • 应用程序传参是通过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编辑器修改变量
在这里插入图片描述
卸载驱动模块并查看内核打印信息(验证文件系统修改变量是否成功)
在这里插入图片描述

修改成功,模块传参验证完毕!接下来是符号导出

最后

以上就是机智小懒猪为你收集整理的驱动学习(二)模块传参的全部内容,希望文章能够帮你解决驱动学习(二)模块传参所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部