2012-11-09 27 views
5

ile kmem_cache_alloc kullanarak Linux sürücüleri hakkında daha fazla bilgi edinme girişiminde basit bir char sürücüsü yazmaya çalışıyorum.Çekirdek NULL işaretçi dereference ile işlenemiyor - struct ile

Sürücü için fikir, her düğümde bir sonraki düğüme tek bir karakter ve bir işaretçi tutacak bağlantılı bir listeye sahip olmaktır. Bu bağlantılı listeyi oluşturmak için bir kmem_cache kullanmayı planladım; çünkü tek bir nesneyi, gerektiğinde, tek bir düğümün basit bir şekilde alacağını düşündüm.

Sorun yaşadığım ilgili kod İşte. Bu şey işe yaramaya çalıştığı için hoş değil.

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); 
} 

Yani önceden bir boş dereference olsun, ben copy_from_user (çağırdığınızda, benim yorumun bakınız) ve bir düğümünde karakter değişkeni geçebilir olarak. Düğüm için belleği ayırdığımdan beri, artık boş olmamalı diye düşündüm. Ayrıca char'i char * 'a ayarlamayı denedim ve farklı sonuçlar aldım, ancak yine de düzgün çalışmadı.

Sorunumun belleğimi nasıl ayırdığımı veya işaretçilerimi nasıl oluşturduğumla ilgili bir yer olduğunu biliyorum, ancak gerçekten burada takılıyorum. Umarım birinin neyin yanlış olduğu hakkında bir fikri vardır.

+0

null dereference öğesinin kaldırılmasının ne olduğunu belirlediniz mi? benim tahminim buf buf problemi bulucu/kafa yerine sorun ... buradaki bazı hata ayıklama çıktısını al ... :) – jheriko

+0

Buda olduğu için emin değilim. char * data yapılamıyor Artık boş değer kullanılmıyor, ancak şu an kafamın üstünden hatırlayamadığım başka bir hata alıyorum. Maalesef şu an işyemden beri test edemiyorum ve bu kodu evde sahip olduğum bir BeagleBoard üzerinde çalıştırıyorum. – Shaun

cevap

2

Bulucu-> verilerinin değerini değil, değerini copy_from_user adresine iletin ve sanırım her şey hazır olacaksınız.

+0

Eve gittiğimde kesinlikle bunu deneyeceğim. Neden aklımdan geçmediğinden emin değilsin ... Ah uykusuzluk ... – Shaun

İlgili konular