三、内核模块传参

内核模块传参有两种
1、在安装驱动的时候传递参数
2、在驱动运行的时候传递参数

1、在安装驱动的时候传递参数

  insmod xxx.ko a=12 b=35

驱动模块中使用的变量的类型

vim include/linux/moduleparam.h +97 

         变量类型    字节大小
bool	 布尔类型		a bool, values 0/1, y/n, Y/N.
invbool	 反布尔类型		the above, only sense-reversed (N = true).
byte		    1个字节	
short		    2个字节	
ushort		    2个字节	
int		    4个字节	
uint 		    4个字节	
long 		    4个字节	
ulong		    4个字节	
charp	字符指针类型		a character pointer

内核中没有字符类型(char),但有byte类型,使用时可以byte类型代替char类型,
但是在传递参数时不能直接传递字符,只能传递整形数,否则会报错

模块编写

   1 #include <linux/init.h>
   2 #include <linux/module.h>
   3 #define N 10
   4 
   5 char a = 100;         //字符类型
   6 int b = 55;           //整型
   7 int c[N];             //整型数组
   8 int len;              //数组长度
   9 char *d = "aaccdd";   //字符指针
  10 
  11 //char
  12 module_param(a,byte,0775);
  13 MODULE_PARM_DESC(a,"this is char type");
  14 
  15 //int
  16 module_param(b,int ,0775);
  17 MODULE_PARM_DESC(b,"this is int type");
  18 
  19 //array
  20 module_param_array(c,int,&len,0775);
  21 MODULE_PARM_DESC(c,"this is int array type");
  22 
  23 //charp
  24 module_param(d,charp,0775);
  25 MODULE_PARM_DESC(d,"this is charp type");
  26
  27 void mydata(void){
  28     int i;
  29     //char
  30     printk("a = %c\n",a);
  31     printk("a = %d\n",a);
  32 
  33     //int
  34     printk("b = %d\n",b);
  35 
  36     //array
  37     for(i=0;i<len;i++){
  38         printk("c[%d] = %d\n",i,c[i]);
  39     }
  40 
  41     //charp
  42     printk("d = %s\n",d);
  43 }
  44 
  45 static int __init mymodule_init(void)
  46 {
  47     mydata();
  48     return 0;
  49 }
  50 
  51 static void __exit mymodule_exit(void)
  52 {
  53     mydata();
  54 }
  55 
  56 module_init(mymodule_init);
  57 module_exit(mymodule_exit);
  58 MODULE_LICENSE("GPL");
  59 MODULE_AUTHOR("Liu Shuren <liusr705@163.com>");
  60 MODULE_DESCRIPTION("this is module");
  61 MODULE_ALIAS("001module");
  62 

模块安装时传入参数

  传参:insmod xxx.ko  a=115 b=66 c=1,2,3,4,5 d="https://www.cnblogs.com/liusr/" 
  查看:dmesg

2、在驱动运行的时候传递参数

【1】前提是驱动模块变量的@perm权限参数设置时不能设置为0
	@perm:权限(0664、0775…)
		其它用户(ugo(用户、组、其它)中的o(其它只能是 1 4 5))不能有写的权限,否则会报错
【2】在 /sys/module/驱动命名的目录/parameters/ 路径下会有以变量的名字命名的普通文件
【3】可以在驱动运行的时候进入 root用户下直接进行修改 
		echo 123 > a
		echo 666>b

3、使用的宏和命令

  modinfo xxx.ko	查看模块信息
  module_param(name,type,perm)
  功能:接收向模块中传递的参数
  参数:
        @name:变量名
        @type:变量的类型
        @perm:权限(0664、0775…)
              其它用户(ugo(用户、组、其它)中的o(其它))不能有写的权限,否则会报错

  module_param_array(name,type,nump,perm)
  功能:用来接收数组
  参数:
        @name:数组的名字
        @type:数组成员的类型
        @nump:接收传递成员的个数(传递的时候需要对变量取地址)
        @perm:权限(0664、0775…)
              其它用户(ugo(用户、组、其它)中的o(其它))不能有写的权限,否则会报错
	
  MODULE_PARM_DESC(name,"string")
  功能:对变量的描述
  参数:
        @变量的名字
        @对变量描述的字段
posted on 2020-12-06 15:37  八杯水  阅读(387)  评论(0)    收藏  举报