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
无欲速,无见小利。欲速,则不达;见小利,则大事不成。