1.module_param()函数的主要作用就是从命令行传递参数。
正如用户编程从main函数通过argc/argv传递。而内核编程要传递参数给模块,首先将获取参数值的变量声明为全局变量,然后使用宏module_param()(在头文件linux/module.h).运行时,=如用户态一样直接跟在命令之后 insmod test.ko count=3;为使代码清晰,变量的声明和宏都应该放在模块代码的开始部分。
module_param定义如下:
#define module_param(name, type, per)
函数有3个参数: 要传递的参数变量名, 变量的数据类型, 以及访问参数的权限。
2.下面具体说说erm参数的作用是什么?
最后的 module_param 字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 <linux/stat.h> 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有 给定的权限.。
权限在include/linux/stat.h中有定义
比如:
#define S_IRWXU 00700 #define S_IRUSR 00400 #define S_IWUSR 00200 #define S_IXUSR 00100 #define S_IRWXG 00070 #define S_IRGRP 00040 #define S_IWGRP 00020 #define S_IXGRP 00010 #define S_IRWXO 00007 #define S_IROTH 00004 #define S_IWOTH 00002 #define S_IXOTH 00001
3.模块参数支持多个参数类型
int long short uint ulong ushort bool invbool charp(字符)
4.举例
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL"); static int count = 1; module_param(count,int,S_IRUSR); static int __init hello_init(void) { int i; for(i=0;i<count;i++) printk("HELLO\n "); return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT"Goodbye"); } module_init(hello_init); module_exit(hello_exit);编译运行:
lwp@lwp-linux:~/Desktop$ make lwp@lwp-linux:~/Desktop$ sudo insmod 11.ko count=5 lwp@lwp-linux:~/Desktop$ dmesg [15162.849220] HELLO [15165.019382] HELLO [15165.019387] HELLO [15165.019389] HELLO [15165.019390] HELLO