2011-12-04 111 views
0

我在使用此係統調用時可能會遇到一些問題,可能是使用了kmalloc。Kmalloc無法正常工作

那麼,基本上我正在建立一個系統調用,這個系統調用和內核編譯沒有問題。 但是當我打電話給我的系統調用時,shell會顯示很多消息,然後電腦崩潰。

我認爲這個問題是與kmalloc的,因爲當我刪除kmalloc的和其他代碼envolves的kmalloc的系統調用完美。

例如:bloqueados = kmalloc(sizeof(struct bloqueio),GFP_ATOMIC);

只需添加: 也許這是一個僵局,但我不知道準確。

謝謝。

這是代碼:

#include <linux/linkage.h> 
#include <linux/io_block_unblock.h> 
//#include <linux/printk.h> 
#include <linux/kernel.h> 
#include <linux/unistd.h> 
#include <linux/stddef.h> 
#include <linux/slab.h> 
#include <linux/gfp.h> 
#include <linux/unistd.h> 
#include <linux/uaccess.h> 
#include <linux/fs.h> 
#include <linux/mount.h> 
#include <linux/genhd.h> 
#include <linux/device.h> 

struct bloqueio *bloqueados; 
EXPORT_SYMBOLL(bloqueados); 
asmlinkage long sys_io_block(const char __user *particao, const char __user *arquivo){ 
    int id_inode; 
    struct file *arq; 
    char *part; 
    struct bloqueio *tmp; 
    arq = filp_open(arquivo,O_CREAT, S_IRWXU); 
    printk(KERN_EMERG "\nstruct file criado para o arquivo %s",arquivo); 
    id_inode = arq->f_path.dentry->d_inode->i_ino; 
    printk(KERN_EMERG "\nO inode do arquivo %s e %d",arquivo, id_inode); 
    //part = arq->f_path.mnt->mnt_sb->s_bdev->bd_part->__dev.init_name; 
    //printk(KERN_EMERG "\nA particao a qual o arquivo se encontra e %s",part); 
    if(bloqueados == NULL){ 
      bloqueados = kmalloc(sizeof(struct bloqueio),GFP_ATOMIC);//<-------------- 
      if(!bloqueados){ 
        printk(KERN_EMERG "\n Erro ao alocar memoria"); 
        return 0; 
      } 
      bloqueados->inode = id_inode; 
      bloqueados->tipo = 0; 
      bloqueados->prox = NULL; 
    } 
    else 
    { 
      tmp = kmalloc(sizeof(struct bloqueio), GFP_ATOMIC);//<-------------------- 
      if(!bloqueados){ 
        printk(KERN_EMERG "\n Erro ao alocar memoria"); 
        return 0; 
      } 
      tmp->inode = id_inode; 
      tmp->tipo = 0; 
      tmp->prox = bloqueados->prox; 
      bloqueados->prox = tmp; 
    } 
    return 1; 

}

我想補充,這是結構bloqueio。

extern int contem(const char *arquivo); 

struct bloqueio{ 
    int inode; 
    int tipo; // 0 -> arquivo 1 -> partição 
    struct bloqueio *prox; 
}; 

extern struct bloqueio *bloqueados; 
+1

粘貼發生崩潰時獲得的Oops消息。 – caf

回答

0

顯然我不能發表評論,所以我會問幾個問題,作爲一個答案......

我看到「EXPORT_SYMBOLL(bloqueados);」 ...這是一個錯誤的只是在你的複製/粘貼,或者在實際代碼中輸入錯誤?這可能是一個問題...

你使用GFP_ATOMIC vs GFP_KERNEL的原因是什麼?

這可能會幫助,

http://www.linuxjournal.com/article/6930

如果你不是絕對需要它...因爲它可以失敗,那麼建議不要使用GFP_ATOMIC。我可能會錯過一些東西,但我不明白你爲什麼需要它......你似乎沒有使用任何鎖。

+0

我試圖用GFP_KERNEL進行分配,但計算機也崩潰了。我認爲EXPORT_SIMBOL(bloqueados)不是問題,因爲它的工作方式沒有kmalloc.But我使用EXPORT_SIMBOL(bloqueados)來引用系統的全局變量。 – UserJ

+0

嗯,我在這裏看到我寫了「EXPORT_SYMBOLL(bloqueados)」,我認爲正確的是「EXPORT_SYMBOL(bloqueados)」。但我認爲我編譯時使用了EXPORT_SYMBOL(bloqueados)。並且我認爲如果我寫了EXPORT_SYMBOLL bloqueados)編譯內核時會出現問題。 – UserJ