在为Linux编写内核模块时,module_param
及其变体可以将字符串作为模块参数,并且该字符串所需的内存空间在后台分配,而无需显式执行任何操作。我的问题是,你应该如何处理这段记忆?如果你不再需要它,你是否必须明确释放它?如果要从模块内部更改字符串,应该怎么做?
答案 0 :(得分:0)
由module_param
为字符串(charp
类型)参数分配的内存由此参数类型的回调维护,请参阅param_set_charp
,param_get_charp
和{{ 1}} param_free_charp
中定义的函数。
使用此类参数进行操作的最简单方法是将其声明为只读,并仅从读取模块中访问它。在这种情况下,无需担心锁定访问或释放参数的值。
如果您想从模块中编写到只读参数,您需要:
1)通过kernel/params.c
获取参数的旧值。
2)为参数指定新值。如果分配了此值,则需要在param_free_charp
或下一次写入参数时手动取消分配。
这两项操作都应在单个关键部分module_exit
/ kernel_param_lock(THIS_MODULE)
内执行,因此从用户空间读取参数的值可能会发现其值已完全初始化。
如果您将参数声明为可写,那么读取模块中的内容需要关键部分kernel_param_unlock(THIS_MODULE)
/ kernel_param_lock(THIS_MODULE)
。
仅当新值存储在其他地方时,才允许将写入可写参数,因此如果参数将从用户空间,如果需要,可以找到并释放其先前的值。
在模块内部写入和读取这样的参数应该遵循与案例2和3相同的要求。