2011-12-04 15 views
0

このシステムコールにはいくつか問題がありますが、おそらくkmallocが原因です。Kmallocが正しく動作しません。

基本的に私はシステムコールを構築していますが、このシステムコールとカーネルは問題なくコンパイルされています。 しかし、私がシステムコールを呼び出すと、シェルはたくさんのメッセージを表示し、コンピュータがクラッシュします。

は私がkmallocのをenvolves kmallocのや他のコードを削除すると、システムコールが完璧に動作しているため問題は、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とGFP_KERNELを使用している理由は何ですか?あなたは絶対にそれを必要としない場合は...それは失敗する可能性があるため

これは役立つかもしれない、

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

それはGFP_ATOMICを使用していないお勧めします。私は何かを逃しているかもしれないが、なぜあなたがそれを必要としているのか分からない...あなたはロックを使用しているようには見えない。

+0

私はGFP_KERNELで割り当てようとしましたが、コンピュータもクラッシュしました.MOFLLISK(bloqueados)が問題ではないと思うのですが、kmalloc.Butなしで動作するためです。EXPORT_SIMBOL(bloqueados)を使ってシステムのグローバル変数。 – UserJ

+0

まあ、ここで私は "EXPORT_SYMBOLL(bloqueados)"を書いていると思っていますが、私は右が "EXPORT_SYMBOL(bloqueados)"だと思いますが、私はEXPORT_SYMBOL(bloqueados)でコンパイルしたと思います。EXPORT_SYMBOLL bloqueados)私はカーネルのコンパイルに問題があります。 – UserJ

関連する問題