编写Linux内核模块时如何处理module_param获得的内存?
How to handle memory obtained by module_param when writing a Linux kernel module?
在为Linux编写内核模块时,module_param
及其变体可以将字符串作为模块参数,该字符串所需的内存space分配在场景而无需明确地做任何事情。我的问题是,你应该如何处理这段内存?如果您不再需要它,是否必须明确释放它?如果你想从模块内部更改字符串,你应该怎么做?
module_param
为字符串(charp
类型)参数分配的内存由此参数类型的回调维护,请参阅 param_set_charp
、param_get_charp
和 param_free_charp
在 kernel/params.c
.
中定义的函数
操作此类参数的最简单方法是将其声明为 Read Only,并从模块访问它仅供 read 。在那种情况下,人们不必为锁定访问权限或释放参数值而烦恼。
如果要从模块写入到只读参数,需要:
1) 通过 param_free_charp
.
释放参数的旧值
2) 为参数分配新值。如果分配了这个值,需要在module_exit
或者下次写入参数时手动解除分配。
这两个操作都应在单个临界区内执行 kernel_param_lock(THIS_MODULE)
/kernel_param_unlock(THIS_MODULE)
,因此可能从用户 space 读取参数值会发现其值已完全初始化。
如果你将参数声明为可写,那么读取它在模块内部需要临界区kernel_param_lock(THIS_MODULE)
/kernel_param_unlock(THIS_MODULE)
.
写入到可写参数仅当新值存储在其他地方,因此如果参数将被用户 space 重写,则可以找到它以前的值并在需要时释放它。
在模块内部写入和读取此类参数应遵循与案例2和案例3相应的相同要求。
在为Linux编写内核模块时,module_param
及其变体可以将字符串作为模块参数,该字符串所需的内存space分配在场景而无需明确地做任何事情。我的问题是,你应该如何处理这段内存?如果您不再需要它,是否必须明确释放它?如果你想从模块内部更改字符串,你应该怎么做?
module_param
为字符串(charp
类型)参数分配的内存由此参数类型的回调维护,请参阅 param_set_charp
、param_get_charp
和 param_free_charp
在 kernel/params.c
.
操作此类参数的最简单方法是将其声明为 Read Only,并从模块访问它仅供 read 。在那种情况下,人们不必为锁定访问权限或释放参数值而烦恼。
如果要从模块写入到只读参数,需要:
1) 通过
释放参数的旧值param_free_charp
.2) 为参数分配新值。如果分配了这个值,需要在
module_exit
或者下次写入参数时手动解除分配。这两个操作都应在单个临界区内执行
kernel_param_lock(THIS_MODULE)
/kernel_param_unlock(THIS_MODULE)
,因此可能从用户 space 读取参数值会发现其值已完全初始化。如果你将参数声明为可写,那么读取它在模块内部需要临界区
kernel_param_lock(THIS_MODULE)
/kernel_param_unlock(THIS_MODULE)
.写入到可写参数仅当新值存储在其他地方,因此如果参数将被用户 space 重写,则可以找到它以前的值并在需要时释放它。
在模块内部写入和读取此类参数应遵循与案例2和案例3相应的相同要求。