如何解决 LKM 中标记为永久的模块

how to resolve module marked permanent in LKM

我写了一个简单的 jiffies 代码,当我尝试执行 rmmod 时,我得到

ERROR: Removing 'jiffi_module': Device or resource busy

所以我做了一些研究,通过执行 lsmod 发现 "permanent" 的症状是由 exit_function 未找到引起的问题。

Module                  Size  Used by
jiffi_module            1027  0 **[permanent]**

实际上我的 make 文件确实显示了与退出函数相关的警告

退出函数定义为

时发出警告
static void __exit
jif_exit(void)
{
    remove_proc_entry("jif", NULL);
}

warning: data definition has no type or storage class
warning: type defaults to ‘int’ in declaration of ‘modile_exit’
warning: parameter names (without types) in function declaration
warning: ‘jif_exit’ defined but not used

当我删除 __exit 时,它似乎至少标识了 jif_exit - 所以现在我收到的警告是

warning: data definition has no type or storage class
warning: type defaults to ‘int’ in declaration of ‘modile_exit’
warning: parameter names (without types) in function declaration

通读下文Why is this kernel module marked at permanent on 2.6.39

它谈到 gcc 不匹配是一个问题?有人可以帮助我无法进一步调试吗?任何指示如何正确加载模块,使其不是永久性的?

内核模块被标记为permanent(无法卸载)如果没有为它定义exit函数。

exit 函数不接受任何参数,return 不接受任何参数,应该使用预定义的名称

进行定义
void cleanup_module(void)
{
    ...
}

或使用任意名称但使用 module_exit 宏注册

void <func_name>(void)
{
    ...
}

module_exit(<func_name>);

static__exitexit函数的属性可选.