2012-11-09 80 views
5

我想寫一個簡單的字符驅動程序,試圖瞭解更多關於Linux中的驅動程序。內核無法處理空指針解除引用 - 使用kmem_cache_alloc與結構

驅動程序的想法是有一個鏈表,每個節點將保存一個字符和一個指向下一個節點的指針。我打算使用kmem_cache來構建這個鏈表,因爲我認爲一次爲單個節點分配單個對象是很簡單的。

這是我遇到問題的相關代碼。這不太好,因爲我只是想讓這個東西起作用。

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變量傳遞一個節點,我得到一個空取消引用。我想,因爲我爲節點分配內存,它不應該是空的了。我也嘗試將char設置爲char *,並得到不同的結果,但它仍然無法正常工作。

我知道我的問題在於我如何分配內存或我構建指針的方式,但我真的被困在這裏。我希望有人對這裏的錯誤有所瞭解。

+0

你確定了什麼是空解除引用?我的猜測是buf是問題而不是finder/head ...在那裏得到一些調試輸出... :) – jheriko

+0

我不確定它是否爲buf,由於事實如果我更改了char數據struct char * data我不再得到空的解引用,但我得到另一個錯誤,我現在不記得我的頭頂。不幸的是,我現在無法再測試它,因爲我在工作,而且我正在家裏的BeagleBoard上運行此代碼。 – Shaun

回答

2

將finder-> data的地址,而不是它的值傳遞給copy_from_user,我想你會全部設置好。

+0

我一定會嘗試,當我回家。不知道爲什麼這不會跨越我的腦海...啊睡眠剝奪... – Shaun