2012-11-09 11 views
5

के साथ kmem_cache_alloc का उपयोग कर मैं लिनक्स में ड्राइवरों के बारे में अधिक जानने के प्रयास में एक साधारण चार ड्राइवर लिखने की कोशिश कर रहा हूं।कर्नेल NULL सूचक dereference को संभालने में असमर्थ - संरचना

चालक के लिए विचार एक लिंक की गई सूची है कि प्रत्येक नोड में एक ही वर्ण और अगले नोड के लिए एक सूचक होगा। मैं इस लिंक्ड सूची को बनाने के लिए एक 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 * को सेट करने का भी प्रयास किया है और इसके परिणाम अलग-अलग हैं, लेकिन यह अभी भी सही तरीके से काम नहीं करता है।

मुझे पता है कि मेरी समस्या कहीं भी है कि मैं स्मृति को आवंटित करने के तरीके या जिस तरह से मैंने अपने पॉइंटर्स का निर्माण किया है, लेकिन मैं वास्तव में यहां फंस गया हूं। मुझे उम्मीद है कि किसी के पास कुछ गलत है कि यहां क्या गलत है।

+0

क्या आपने यह निर्धारित किया है कि शून्य dereference dereferencing क्या है? मेरा अनुमान है कि buf खोजक/सिर की बजाय समस्या है ... वहां कुछ डीबग आउटपुट प्राप्त करें ... :) – jheriko

+0

मुझे यकीन नहीं है कि यह बफ है, इस तथ्य के कारण कि अगर मैं अपने डेटा में बदलता हूं चार * डेटा के लिए संरचना अब मुझे शून्य अव्यवस्था नहीं मिलती है, लेकिन मुझे एक और त्रुटि मिलती है जिसे मैं अभी अपने सिर के ऊपर से याद नहीं कर सकता। दुर्भाग्य से मैं अभी काम नहीं कर रहा हूं क्योंकि मैं काम पर हूं और मैं इस कोड को एक बीगल बोर्ड पर चला रहा हूं जो मेरे पास है। – Shaun

उत्तर

2

खोजकर्ता का पता पास करें-> डेटा, इसकी कीमत नहीं, copy_from_user पर, और मुझे लगता है कि आप सभी सेट हो जाएंगे।

+0

मैं निश्चित रूप से कोशिश करता हूं कि जब मैं घर जाऊं। यकीन नहीं है कि क्यों मेरे दिमाग को पार नहीं किया ... आह नींद की कमी ... – Shaun

संबंधित मुद्दे