2012-11-09 3 views
5

Linuxでドライバの詳細を調べるために、単純なcharドライバを作成しようとしています。カーネルがNULLポインタの参照を処理できません - struct with kmem_cache_allocを使用しています

ドライバのアイデアは、各ノードに1つの文字と次のノードへのポインタを保持するリンクリストを持たせることです。私はkmem_cacheを使用してこのリンクリストを構築しようと考えていました。私は、必要に応じて個々のノードに対して一度に1つのオブジェクトを割り当てることは簡単だと考えていました。

問題が発生している関連コードは次のとおりです。私はちょうどこのことがうまくいくようにしようとしているので、それはかなりではありません。

struct kmem_cache *memCache; 

typedef struct { 
    char data; 
    struct node* next; 
} node; 

node *head = NULL; 

static ssize_t hello_write(struct file *file, const char *buf, size_t count, loff_t *ppos) 
{ 
    int i; 
    accesscount++; 

    for(i = 0; i < count; i++) 
    { 
     node *finder; 
     node *temp; 

     finder = head; 

     if(finder == NULL) 
     { 
      finder = kmem_cache_alloc(memCache, GFP_KERNEL); 
      //memset(finder, 0, sizeof(node)); 

      if(!finder) 
       return -ENOMEM; 

      finder->next = NULL; 

      //!!!NULL DEREFERENCE HERE!!! 
      copy_from_user(finder->data, buf+i, 1); 

      head = finder; 
     } 
     else 
     { 
      while(finder->next != NULL) 
       finder = finder->next; 

      temp = kmem_cache_alloc(memCache, GFP_KERNEL); 
      //memset(temp, 0, sizeof(node)); 

      if(!temp) 
       return -ENOMEM; 

      temp->next = NULL; 

      copy_from_user(temp->data, buf+i, 1); 

      finder->next = temp; 
     } 

     charsStored++; 
    } 

    return count; 
} 

static int __init hello_init(void) 
{ 
    memCache = kmem_cache_create("hello1", sizeof(node), 0, 0, NULL); 
} 

あなたは私がcopy_from_user(呼び出すときに、私のコメントから参照)、ノード内のchar型の変数に渡すことができますように、私はNULL間接参照を取得します。私はノードのためのメモリを割り当てたので、それはもはやnullではないはずです。また、char *にcharを設定しようとしましたが、別の結果が得られましたが、それでも正しく機能しませんでした。

私の問題は、メモリの割り当て方法やポインターの作成方法などにありますが、実際にはここに固執しています。私は誰かがここで間違っていることのいくつかのアイデアを持っていることを望む

+0

null参照解除が逆参照であることを判断しましたか?私の推測では、bufはfinder/headよりもむしろ問題です...そこにいくつかのデバッグ出力を得ています... :) – jheriko

+0

bufかどうかわかりません。 struct to char * data私はもはやnullの逆参照を取得しませんが、私は頭の上から覚えていない別のエラーが発生します。残念ながら、私は仕事中であり、私は自宅にいるビーグルボードでこのコードを実行しているので、今すぐにもう一度テストすることはできません。 – Shaun

答えて

2

その値ではなく、finder-> dataのアドレスをcopy_from_userに渡すと、すべて設定されると思います。

+0

私が家に帰るとき、私は間違いなくそれを試みます。それがなぜ私の心を越えていないのか分かりません...ああ、睡眠不足... – Shaun

関連する問題