2015-10-28 46 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

當我嘗試註銷模塊時,它給了我一個終端「死亡」的消息......我不知道哪個進程在這裏死亡 –