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

时间:2015-10-31 22:13:36

标签: linux-kernel linux-device-driver kernel-module permanent

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

ERROR: Removing 'jiffi_module': Device or resource busy

所以我做了一些研究,并通过做lsmod以下的症状发现"永久性"是由于找不到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不匹配是一个问题?有人可以请求帮助我无法进一步调试吗?任何指针如何正确加载模块,使其不是永久性的?

1 个答案:

答案 0 :(得分:1)

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

退出函数不接受任何参数并且不返回任何内容,应使用预定义名称定义

void cleanup_module(void)
{
    ...
}

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

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

module_exit(<func_name>);

静态 __退出以及退出功能的其他属性是可选的。