4412 内核模块传参数

单个参数

  • 应用程序中可以在main的参数传值
  • 头文件在"include/linux/moduleparam.h"
  • 内核模块可以通过module_param来传单个参数
    • module_param(name, type, perm)
    • name:模块参数的名称
    • type:模块参数的数据类型(支持int long short uint ulong ushort 类型)
    • perm:模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)

 

多个参数

  • 传递多个参数module_param_array(name, type, nump, perm)
    • name:模块参数名称
    • type:模块参数的数据类型(支持int long short uint ulong ushort类型)
    • nump:保存参数个数的地址
    • perm:模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)

 

内核模块传参数

  • 参数perm表示此参数在sysfs文件系统中所对应的文件结点的属性,其权限在include/linux/stat.h中有定义
  • 变量perm
    • #define S_IRUSR 00400 文件所有者可读
    • #define S_IWUSR 00200 文件所有者可写
    • #define S_IXUSR 00100 文件所有者可执行
    • #define S_IRGRP 00040 与文件所有者同组的用户可读
    • #define S_IWGRP 00020
    • #define S_IXGRP 00010
    • #define S_IROTH 00004 与文件所有者不同组的用户可读
    • #define S_IWOTH 00002
    • #define S_IXOTH 00001

将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为1表示文件所有者可读,

第二位为1表示文件所有者可写,第三位为1表示文件所有者可执行

接下来三位表示文件所有者同组成员的权限,再下来三位为不同组用户权限

 

  • 将Makefile命令clean完善,执行clean命令可以将所有无关的文件删除
  • 在02_DriverModule_01例程的基础上编写简单模块module_param,测试模块传参数,并将传递的参数打印出来。
    • insmod /mnt/udisk/module_param.ko module_arg1=10 module_arg2=20 int_array=11,12,13,14,15,16,17,18
    • cat /sys/module/module_param/parameters/xxx 可以查询参数

 

#include <linux/init.h>
#include <linux/module.h>

/* define module_param module_param_array header file */
#include <linux/moduleparam.h>
/* define perm's head file*/
#include <linux/stat.h>

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET");

static int module_arg1, module_arg2;
static int int_array[50];
static int int_num;

module_param(module_arg1, int, S_IRUSR);
module_param(module_arg2, int, S_IRUSR);
module_param_array(int_array, int, &int_num, S_IRUSR);

static int hello_init(void)
{
        int i;
        printk(KERN_EMERG "module_arg1 is %d!\n", module_arg1);
        printk(KERN_EMERG "module_arg2 is %d!\n", module_arg2);
        if(int_num > 0) {
                for(i=0;i<int_num;i++) {
                        printk(KERN_EMERG "int_array[%d] is %d!\n", i, int_array[i]);
                }
        }
        printk(KERN_EMERG "Hello World enter!\n");
        return 0;
}

static void hello_exit(void)
{
        printk(KERN_EMERG "HELLO World exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);

测试效果:

[root@iTOP-4412]# insmod module_param.ko module_arg1=10 module_arg2=20 int_array                           
=11,12,13,14,15,16,17,18
[15894.520387] module_arg1 is 10!
[15894.522007] module_arg2 is 20!
[15894.525113] int_array[0] is 11!
[15894.528173] int_array[1] is 12!
[15894.531350] int_array[2] is 13!
[15894.534412] int_array[3] is 14!
[15894.537579] int_array[4] is 15!
[15894.540702] int_array[5] is 16!
[15894.543786] int_array[6] is 17!
[15894.546949] int_array[7] is 18!
[15894.550068] Hello World enter!
[root@iTOP-4412]# cat /sys/module/mo                                                                       
module_param/  mousedev/
[root@iTOP-4412]# cat /sys/module/module_param/parameters/                                                 
int_array    module_arg1  module_arg2
[root@iTOP-4412]# cat /sys/module/module_param/parameters/module_arg1                                      
10
[root@iTOP-4412]# cat /sys/module/module_param/parameters/*                                                
11,12,13,14,15,16,17,18
10
20

 

posted @ 2018-08-11 14:22  习惯就好233  阅读(152)  评论(0编辑  收藏  举报