2012-11-09 30 views
5

Tôi đang cố gắng viết một trình điều khiển đơn giản trong một nỗ lực để tìm hiểu thêm về các trình điều khiển trong Linux.Hạt nhân không thể xử lý NULL pointer dereference - sử dụng kmem_cache_alloc với struct

Ý tưởng cho trình điều khiển là có danh sách được liên kết trong mỗi nút sẽ giữ một ký tự đơn và một con trỏ tới nút tiếp theo. Tôi dự định sử dụng một kmem_cache để xây dựng danh sách liên kết này khi tôi nghĩ rằng phân bổ một đối tượng duy nhất tại một thời điểm, nếu cần thiết, cho một nút riêng lẻ sẽ đơn giản.

Đây là mã liên quan mà tôi đang gặp sự cố. Nó không đẹp, vì tôi chỉ cố gắng để có được điều này để làm việc.

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

Vì vậy, như bạn có thể thấy từ nhận xét của mình, khi tôi gọi copy_from_user() và chuyển vào biến char trong một nút, tôi nhận được một tham số rỗng. Tôi nghĩ rằng kể từ khi tôi phân bổ bộ nhớ cho nút, nó không nên null nữa. Tôi cũng đã cố gắng thiết lập char char * thay vào đó và có kết quả khác nhau, nhưng nó vẫn không hoạt động chính xác.

Tôi biết vấn đề của mình nằm ở đâu đó với cách tôi phân bổ bộ nhớ hoặc cách tôi tạo con trỏ của mình, nhưng tôi thực sự bị kẹt ở đây. Tôi hy vọng ai đó có một số ý tưởng về những gì là sai ở đây.

+0

bạn đã xác định xem dereference rỗng là dereferencing chưa? đoán của tôi là buf là vấn đề chứ không phải là finder/head ... nhận được một số đầu ra gỡ lỗi trong đó ... :) – jheriko

+0

Tôi không chắc chắn nếu nó là buf, do thực tế là nếu tôi thay đổi dữ liệu char trong của tôi struct to char * data Tôi không còn nhận được dereference null, nhưng tôi nhận được một lỗi khác mà tôi không thể nhớ ra khỏi đỉnh đầu của tôi ngay bây giờ. Rất tiếc, tôi không thể kiểm tra lại ngay bây giờ vì tôi đang làm việc và tôi đang chạy mã này trên BeagleBoard tôi có ở nhà. – Shaun

Trả lời

2

Vượt qua địa chỉ của công cụ tìm kiếm-> dữ liệu, không phải giá trị của nó, đến copy_from_user và tôi nghĩ bạn sẽ được thiết lập.

+0

Tôi chắc chắn sẽ cố gắng khi tôi về nhà. Không chắc tại sao điều đó không vượt qua tâm trí của tôi ... Ah thiếu ngủ ... – Shaun

Các vấn đề liên quan