2015-10-28 49 views
0

你好我是内核空间编程的新手,我来了解proc文件系统。/proc文件系统挂起我的系统

我写它创建了一个proc文件同时注册

我删除,同时注销该模块的模块。 但是,如果我不删除该文件使用remove_proc_entry()并取消注册我的模块,然后系统挂起一段时间后

为什么这样呢?

该代码是

#include<linux/init.h> 
#include<linux/kernel.h> 
#include<linux/proc_fs.h> 
#include<linux/module.h> 
#include<linux/fs.h> 

int myopen(struct inode *, struct file *); 
ssize_t myread(struct file *, char __user *, size_t, loff_t *); 

int myopen(struct inode *p, struct file *q) 
{ 
     printk(KERN_ALERT "I am in myopen\n"); 
     return 0; 
} 

ssize_t myread(struct file *p, char __user *q, size_t r, loff_t *s) 
{ 
     printk(KERN_ALERT "I am in myread\n"); 
     return 0; 
} 

static const struct file_operations fs={ 
     .open=myopen, 
     .read=myread 
}; 

int start(void) 
{ 
     proc_create("myprocfile", 0, NULL, &fs); 
     return 0; 
} 

void stop(void) 
{ 
     //remove_proc_entry("myprocfile", NULL); 
     /* 
      If I uncomment the above line 
      then everything works fine 
     */ 
} 

module_init(start); 
module_exit(stop); 
MODULE_LICENSE("GPL"); 

回答

1

当文件被访问时,file_operations结构被读出,以及我未来行动取决于指针,存储在此结构。

如果在模块退出时不删除文件,则文件仍然可以访问。但是file_operations结构,关联它,被释放。因此,卸载模块后对文件的任何访问都会导致读取已释放的数据。访问内存时触发错误。

这就是为什么内核模块删除它之前创建的所有对象至关重要。

+0

非常感谢您的良好解释.....但是我不理解我注销了执行文件操作的模块。我没有为此写任何用户空间代码......然后谁在释放内存上执行操作? –

+0

它可以是,例如,系统deamon,它定期检查文件。在任何情况下,与释放操作结构相关的文件都是不好的。 – Tsyvarev

+0

当我尝试注销模块时,它给了我一个终端“死亡”的消息......我不知道哪个进程在这里死亡 –