1.模块传参基础
在Linux内核中,可以使用模块传参的方式向内核模块传递参数。这些参数可以在模块加载时动态地传递给模块,以便模块根据这些参数进行相应的配置或行为。
模块传参是通过在模块加载时从命令行传递参数给内核来实现的。这些参数可以在模块的源代码中被读取和解析,以决定模块的行为或配置。
要使用模块传参,需要在模块的源代码中定义一个或多个参数,并使用内核提供的宏来声明和定义这些参数。这些宏包括 module_param、module_param_array 等。
例如,以下是一个简单的内核模块的示例,它使用 module_param 宏来声明一个名为 my_param 的参数:
#include <linux/module.h>
#include <linux/kernel.h>
static int my_param = 0;
module_param(my_param, int, S_IRUGO);
static int __init xuedaon_init(void)
{
printk(KERN_INFO "My parameter: %d ", my_param);
return 0;
}
static void __exit xuedaon_exit(void)
{
printk(KERN_INFO "Module exit! ");
}
module_init(xuedaon_init);
module_exit(xuedaon_exit);
MODULE_LICENSE("GPL");
在这个示例中,my_param 是一个整数类型的参数,其默认值为0。module_param 宏的第一个参数是参数的名称,第二个参数是参数的数据类型,第三个参数是参数的访问权限。在这个例子中,参数的访问权限被设置为 S_IRUGO,表示该参数可以在用户空间中读取。
要向这个模块传递参数,可以使用 insmod 命令并在命令行中指定参数的值,如下所示:
sudo insmod xuedaon.ko my_param=10
在这个命令中,my_param=10 是传递给模块的参数。当模块被加载时,它会读取 my_param 的值,并将其打印到内核日志中。
2.模块传参接口函数
module_param () 是 Linux 内核模块编程中的一个宏,用于声明模块参数。这些参数可以在模块加载时被传递给内核,从而影响模块的行为或配置。
module_param () 的通常包括三个部分:参数的名称、参数的数据类型和参数的访问权限。例如:
module_param(name, type, perm);
其中:
name 是参数的名称,它在模块加载时由用户指定。
type 是参数的数据类型,可以是上面提到的整型、字符指针等。
perm 是参数的访问权限,它决定了哪个用户可以访问这个参数。
module_param_array 是 Linux 内核模块编程中的一个宏,用于声明一个数组类型的模块参数。这个宏允许用户在模块加载时传递一个数组给内核,以配置模块的行为或状态。
module_param_array 宏的使用通常包括三个部分:数组的名称、数组元素的数据类型和数组的访问权限。例如:
module_param_array(name, type, perm, size);
其中:
name 是数组的名称,它在模块加载时由用户指定。
type 是数组元素的数据类型,可以是上面提到的整型、字符指针等。
perm 是数组的访问权限,它决定了哪个用户可以访问这个数组。
size 是数组的大小,它是一个指向整型的指针,用于存储数组的长度。
3.模块参数权限
在 Linux 内核模块编程中,当需要从用户空间向内核模块传递参数时,这些参数的权限和可用性是非常重要的。参数权限由 module_param() 宏的第三个参数指定。常见的权限参数包括:
S_IRUGO:表示该参数是只读的,用户可以读取其值,但不能修改。
S_IWUSR:表示该参数是可写的,用户可以修改其值。
S_IXUSR:表示该参数具有执行权限,通常用于设置某些标志或开关。
S_IRGRP:与文件所有者同组的用户可读
S_IWGRP:与文件所有者同组的用户可写
S_IXGRP:与文件所有者同组的用户可执行
S_IROTH:与文件所有者不同组的用户可读
S_IWOTH:与文件所有者不同组的用户可写
S_IXOTH :与文件所有者不同组的用户可执行
权限的组合:可以使用位运算符(如 |)来组合多个权限。例如,S_IRUGO | S_IWUSR 表示该参数是读写权限。