编写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_charpparam_get_charpparam_free_charpkernel/params.c.

中定义的函数
  1. 操作此类参数的最简单方法是将其声明为 Read Only,并从模块访问它仅供 read 。在那种情况下,人们不必为锁定访问权限或释放参数值而烦恼。

  2. 如果要从模块写入只读参数,需要:

    1) 通过 param_free_charp.

    释放参数的旧值

    2) 为参数分配新值。如果分配了这个值,需要在module_exit或者下次写入参数时手动解除分配。

    这两个操作都应在单个临界区内执行 kernel_param_lock(THIS_MODULE)/kernel_param_unlock(THIS_MODULE),因此可能从用户 space 读取参数值会发现其值已完全初始化。

  3. 如果你将参数声明为可写,那么读取它在模块内部需要临界区kernel_param_lock(THIS_MODULE)/kernel_param_unlock(THIS_MODULE).

  4. 写入可写参数仅当新值存储在其他地方,因此如果参数将被用户 space 重写,则可以找到它以前的值并在需要时释放它。

    在模块内部写入和读取此类参数应遵循与案例2和案例3相应的相同要求。