在编写Linux内核模块时如何处理module_param获取的内存?

时间:2016-03-26 12:12:41

标签: linux-kernel systems-programming memory-management

在为Linux编写内核模块时,module_param及其变体可以将字符串作为模块参数,并且该字符串所需的内存空间在后台分配,而无需显式执行任何操作。我的问题是,你应该如何处理这段记忆?如果你不再需要它,你是否必须明确释放它?如果要从模块内部更改字符串,应该怎么做?

1 个答案:

答案 0 :(得分:0)

module_param为字符串(charp类型)参数分配的内存由此参数类型的回调维护,请参阅param_set_charpparam_get_charp和{{ 1}} param_free_charp中定义的函数。

  1. 使用此类参数进行操作的最简单方法是将其声明为只读,并仅从读取模块中访问它。在这种情况下,无需担心锁定访问或释放参数的值。

  2. 如果您想从模块中编写只读参数,您需要:

    1)通过kernel/params.c获取参数的旧值。

    2)为参数指定新值。如果分配了此值,则需要在param_free_charp或下一次写入参数时手动取消分配。

    这两项操作都应在单个关键部分module_exit / kernel_param_lock(THIS_MODULE)内执行,因此从用户空间读取参数的值可能会发现其值已完全初始化。

  3. 如果您将参数声明为可写,那么读取模块中的内容需要关键部分kernel_param_unlock(THIS_MODULE) / kernel_param_lock(THIS_MODULE)

  4. 仅当新值存储在其他地方时,才允许将写入可写参数,因此如果参数将从用户空间,如果需要,可以找到并释放其先前的值。

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