当前位置: 技术问答>linux和unix
内核模块无法卸载
来源: 互联网 发布时间:2016-03-23
本文导语: 早上写了个模块加载到内核里,结果卸载的时候说设备忙?我用lsmod看了一下,我的模块used by那一栏里是0[permanent],之后我又加载了一个以前写的module,一切正常,lsmod 中 used by 就没有那个[permanent],这个是什么意...
早上写了个模块加载到内核里,结果卸载的时候说设备忙?我用lsmod看了一下,我的模块used by那一栏里是0[permanent],之后我又加载了一个以前写的module,一切正常,lsmod 中 used by 就没有那个[permanent],这个是什么意思啊?如何会导致一个模块的used by里变成permanent?下面是module的代码和makefile
/**************module code********************/
include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ZHOUFAN");
#define proc_name "my_proc"
static struct proc_dir_entry *proc_file;
static struct nf_hook_ops nfinfo;
static int frame_count = 0;
int rd_proc(char *page, char **start, off_t off, int count, int *eof, void *data)
{
int ret;
printk(KERN_INFO"procfile_read(/proc/%s) calledn",proc_name);
if ( off > 0)
{
ret = 0;
}else {
ret = sprintf(page,"frame_count is %d n",frame_count);
}
return ret;
}
unsigned int my_hook_fn( unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn) ( struct sk_buff *))
{
frame_count++;
return NF_DROP;
}
int init_module()
{
nfinfo.hook = my_hook_fn;
nfinfo.pf = PF_INET;
nfinfo.hooknum = NF_IP_POST_ROUTING;
nfinfo.priority = NF_IP_PRI_FIRST;
nf_register_hook( &nfinfo );
proc_file = create_proc_entry(proc_name,0,NULL);
if( NULL == proc_file)
{
remove_proc_entry(proc_name,&proc_root);
printk(KERN_ALERT"Error:could not initialize /proc/%sn",proc_name);
return -ENOMEM;
}
proc_file->read_proc= rd_proc;
printk(KERN_INFO"/proc/%s createdn", proc_name);
return 0;
}
void cleanup_moduel()
{
printk(KERN_INFO"entering cleanup module!n");
nf_unregister_hook( &nfinfo );
printk(KERN_INFO"hook function unregisteredn");
remove_proc_entry(proc_name,&proc_root);
printk(KERN_INFO"/proc/%s removedn", proc_name);
}
/**************module code********************/
include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ZHOUFAN");
#define proc_name "my_proc"
static struct proc_dir_entry *proc_file;
static struct nf_hook_ops nfinfo;
static int frame_count = 0;
int rd_proc(char *page, char **start, off_t off, int count, int *eof, void *data)
{
int ret;
printk(KERN_INFO"procfile_read(/proc/%s) calledn",proc_name);
if ( off > 0)
{
ret = 0;
}else {
ret = sprintf(page,"frame_count is %d n",frame_count);
}
return ret;
}
unsigned int my_hook_fn( unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn) ( struct sk_buff *))
{
frame_count++;
return NF_DROP;
}
int init_module()
{
nfinfo.hook = my_hook_fn;
nfinfo.pf = PF_INET;
nfinfo.hooknum = NF_IP_POST_ROUTING;
nfinfo.priority = NF_IP_PRI_FIRST;
nf_register_hook( &nfinfo );
proc_file = create_proc_entry(proc_name,0,NULL);
if( NULL == proc_file)
{
remove_proc_entry(proc_name,&proc_root);
printk(KERN_ALERT"Error:could not initialize /proc/%sn",proc_name);
return -ENOMEM;
}
proc_file->read_proc= rd_proc;
printk(KERN_INFO"/proc/%s createdn", proc_name);
return 0;
}
void cleanup_moduel()
{
printk(KERN_INFO"entering cleanup module!n");
nf_unregister_hook( &nfinfo );
printk(KERN_INFO"hook function unregisteredn");
remove_proc_entry(proc_name,&proc_root);
printk(KERN_INFO"/proc/%s removedn", proc_name);
}
|
把void cleanup_moduel()改为
void cleanup_module() .
内核认为这模块没有清除方法而认为是[permanent].
void cleanup_module() .
内核认为这模块没有清除方法而认为是[permanent].
|
尝试一下清掉所有的iptables策略