1. 程式人生 > 實用技巧 >01Linux驅動模組03

01Linux驅動模組03

三、核心模組傳參

核心模組傳參有兩種
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型別,使用時可以type代替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 <[email protected]>");
  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")
  功能:對變數的描述
  引數:
        @變數的名字
        @對變數描述的欄位