module_param实现
时间: 2023-11-28 20:04:17 浏览: 139
module_param实际上是一个宏,它定义了一个模块参数,并生成了相应的代码。
具体实现中,module_param宏定义了一个静态变量,该变量保存了模块参数的值。在模块初始化时,内核会读取/sys/module/<module_name>/parameters/目录下的文件,将其中的值保存到相应的静态变量中。在模块代码中,可以通过访问该静态变量来获取模块参数的值。
此外,module_param还生成了与模块参数相关的一些函数,例如用于读写模块参数值的get/set函数,以及用于显示模块参数信息的show函数等。这些函数在模块初始化时被注册到内核中,供其他模块或用户空间程序调用。
总之,module_param实现了一种简单而方便的方式,使得内核模块可以在加载时接受一些参数的配置,从而提高了内核模块的灵活性和可配置性。
相关问题
module_param代码实现
module_param是一个宏,它定义了一个静态变量,并自动生成了相关的get/set函数和show函数。下面是module_param的代码实现:
```
#define module_param(name, type, perm) \
module_param_named(name, name, type, perm)
#define module_param_named(name, value, type, perm) \
static type __param_ ## name ## _val = value; \
module_param_call(name, ¶m_ops_##type, &__param_ ## name ## _val, perm)
#define module_param_call(name, ops, arg, perm) \
param_check_##ops(&(ops), &(arg)); \
__module_param_call(name, &(ops), (arg), sizeof(*(arg)), perm)
#define __module_param_call(name, ops, arg, size, perm) \
__setup_param_call(setup_param_##name, ops, arg); \
__param_check_##name##_##ops((arg)); \
static struct kernel_param __param_arr_##name \
__used \
__attribute__((section(".param"), aligned(sizeof(void *)))) \
= { \
.name = __stringify(name), \
.ops = ops, \
.arg = (void *)arg, \
.size = size, \
.perm = perm, \
}; \
__setup_param(setup_param_##name, __param_arr_##name.ops, __param_arr_##name.arg);
#define __setup_param_call(fn, ops, arg) \
static int __init fn(void) \
{ \
param_array_ops(ops, arg); \
return 0; \
}
#define __setup_param(fn, ops, arg) \
core_param(fn, ops, arg, sizeof(*(arg)))
#define __param_check(name, p) \
__param_check_##name(p)
#define __param_check_string(name, p) \
__param_check_string_##name(p)
#define __param_check_charp(name, p) \
__param_check_charp_##name(p)
#define __param_check_bool(name, p) \
__param_check_bool_##name(p)
#define __param_check_invbool(name, p) \
__param_check_invbool_##name(p)
#define __param_check_invbool_y(name, p) \
__param_check_invbool_y_##name(p)
#define __param_check_invbool_n(name, p) \
__param_check_invbool_n_##name(p)
#define __param_check_int(name, p) \
__param_check_int_##name(p)
#define __param_check_long(name, p) \
__param_check_long_##name(p)
#define __param_check_ulong(name, p) \
__param_check_ulong_##name(p)
#define __param_check_byte(name, p) \
__param_check_byte_##name(p)
#define __param_check_short(name, p) \
__param_check_short_##name(p)
#define __param_check_ushort(name, p) \
__param_check_ushort_##name(p)
#define __param_check_uint(name, p) \
__param_check_uint_##name(p)
#define __param_check_intvec(name, p) \
__param_check_intvec_##name(p)
#define __param_check_charpvec(name, p) \
__param_check_charpvec_##name(p)
#define __param_check_boolvec(name, p) \
__param_check_boolvec_##name(p)
...
```
module_param宏的实现是比较复杂的,其中包含了大量的宏定义和函数调用。在使用module_param宏时,实际上只需要了解其基本用法,而不需要了解其详细实现。
module_param_named代码实现
module_param_named是一个宏,用于在内核模块中定义一个可被用户空间修改的参数,并且该参数可以在模块加载时被指定。下面是一个示例代码实现:
```c
#include <linux/module.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("GPL");
static int my_param = 0;
module_param_named(my_param, my_param, int, S_IRUSR | S_IWUSR);
static int __init my_module_init(void)
{
printk(KERN_INFO "my_param=%d\n", my_param);
return 0;
}
static void __exit my_module_exit(void)
{
printk(KERN_INFO "Goodbye\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
```
在此示例中,我们定义了一个名为my_param的整型参数,并使用module_param_named将其导出为可被修改的参数。第一个参数是参数的名称,第二个参数是指向该参数变量的指针,第三个参数是参数的类型,最后一个参数是参数的权限。
在模块加载时,该参数可以通过insmod命令行参数的形式进行指定。例如,如果我们想将my_param设置为5,可以使用以下命令加载该模块:
```sh
insmod my_module.ko my_param=5
```
在模块初始化函数中,我们可以使用my_param变量来访问该参数的值。如果未指定该参数,则my_param的默认值为0。
阅读全文