我想寫一個簡單的字符驅動程序,試圖瞭解更多關於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 *,並得到不同的結果,但它仍然無法正常工作。
我知道我的問題在於我如何分配內存或我構建指針的方式,但我真的被困在這裏。我希望有人對這裏的錯誤有所瞭解。
你確定了什麼是空解除引用?我的猜測是buf是問題而不是finder/head ...在那裏得到一些調試輸出... :) – jheriko
我不確定它是否爲buf,由於事實如果我更改了char數據struct char * data我不再得到空的解引用,但我得到另一個錯誤,我現在不記得我的頭頂。不幸的是,我現在無法再測試它,因爲我在工作,而且我正在家裏的BeagleBoard上運行此代碼。 – Shaun