如何解决 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、__exit等exit函数的属性可选.
我写了一个简单的 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、__exit等exit函数的属性可选.