2011-11-24 14 views
9

में register_chrdev_region() के बारे में प्रश्न register_chrdev_region(dev_t from, unsigned count, const char * name); का उपयोग कर कर्नेल मॉड्यूल के पंजीकरण के बारे में सीख रहा हूं।linux डिवाइस ड्राइवर

मुझे लगता है कि इस फ़ंक्शन के साथ या उसके बिना, मेरे कर्नेल मॉड्यूल अपेक्षित के रूप में काम करता है। कोड मैं परीक्षण के लिए इस्तेमाल किया:

first = MKDEV(MAJOR_NUM, MINOR_NUM); 
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without 

mycdev=cdev_alloc(); 
mycdev->ops= &fops; 
mycdev->owner = THIS_MODULE; 

if (cdev_add(mycdev,first, count) == 0) 
{printk(KERN_ALERT "driver loaded\n");} 

मैं लाइन register_chrdev_region(first, count, DEVICE_NAME); बाहर टिप्पणी की, और printk संदेश अभी भी दिखाई दिया। मैंने उपयोगकर्ता के स्थान से या इसके बिना चालक के साथ संवाद करने की कोशिश की, और दोनों सफल रहे।

तो मेरा सवाल यह है कि, यह कार्य register_chrdev_region() है जो केवल मेरे ड्राइवर को एक अच्छा कर्नेल नागरिक बनाने के लिए उपयोग किया जाता है, जैसे कि "मैं बड़ी संख्या का उपयोग कर रहा हूं, कृपया उपयोग न करें"?

मैंने फ़ंक्शन को समझने के लिए कर्नेल स्रोत char_dev.c में एक नज़र डालने का प्रयास किया, लेकिन मुझे यह समझना बहुत मुश्किल लगता है, जो इससे परिचित है?

धन्यवाद!

उत्तर

8

यह काम करेगा क्योंकि यह वास्तव में आपके डिवाइस नंबरों को आवंटित करने के लिए आवश्यक नहीं है। वास्तव में, इसे कई कर्नेल डेवलपर्स द्वारा गतिशील (ऑन-द-फ्लाई, आवश्यकतानुसार) आवंटन फ़ंक्शन alloc_chrdev_region का उपयोग करने के लिए बेहतर माना जाता है।

आप इसे स्थिर सामने या गतिशील रूप में की जरूरत है, यह कुछ आप नियमों द्वारा निभाई हो सकता है जो और जो नंबर आप का उपयोग करने के प्रयास कर रहे हैं आवंटित किया गया अन्य डिवाइस ड्राइवर के साथ संघर्ष से बचने के लिए क्या करना चाहिए है या नहीं। यहां तक ​​कि यदि आपका चालक इसके बिना पूरी तरह से अच्छा काम करता है, तो यह आवश्यक नहीं होगा कि प्रत्येक मशीन पर या भविष्य में किसी भी समय।

नियम एक कारण के लिए हैं, खासकर निम्न स्तर की सामग्री के साथ, आपको अच्छी तरह से उनका पालन करने की सलाह दी जाती है।

सेट-अप प्रक्रिया के बारे में अधिक जानकारी के लिए here देखें।

1

यदि आपके डिवाइस के लिए बड़ी संख्या पहले से उपयोग में आने वाले किसी अन्य डिवाइस के साथ संघर्ष करती है, तो ड्राइवर को आवंटन नहीं किया जाएगा।

यदि आप पहले ही परीक्षण कर चुके हैं कि कौन सी बड़ी संख्या नि: शुल्क है और इसका उपयोग किया जाता है, तो यह आमतौर पर कोई त्रुटि नहीं फेंक सकता है और आप ड्राइवर को लोड करने में कोई समस्या नहीं करेंगे।

लेकिन यदि आप विभिन्न प्रणालियों पर चलते हैं और यदि बड़ी संख्या पहले ही कब्जा कर लिया गया है और किसी अन्य सिस्टम द्वारा उपयोग किया जाता है।, तो आपका ड्राइवर लोडिंग विफल हो सकता है।

गतिशील आवंटन का उपयोग करना हमेशा बेहतर होता है !!

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