लिनक्स कर्नेल मॉड्यूललिनक्स कर्नेल मॉड्यूल में डिवाइस वर्ग (struct वर्ग) मौजूदा के लिए सूचक प्राप्त
हाय सब में डिवाइस वर्ग (struct class
) मौजूदा के लिए सूचक प्राप्त करें!
मैं किसी मौजूदा डिवाइस क्लास में डिवाइस को पंजीकृत करने का प्रयास कर रहा हूं, लेकिन मुझे मौजूदा क्लास में पॉइंटर प्राप्त करने में समस्या हो रही है। कर्नेल संस्करण लिनक्स 3.3.6 है। मैं एक मॉड्यूल में एक वर्ग बना सकते हैं, यह करने के लिए सूचक और फिर डिवाइस रजिस्टर करने के लिए इसका इस्तेमाल करते हैं:
*cl = class_create(THIS_MODULE, className);
dev_ret = device_create(*cl, NULL, *dev, NULL, driverName);
हालांकि मैं एक मॉड्यूल के साथ एक ही कक्षा में एक और डिवाइस रजिस्टर करने की आवश्यकता है, लेकिन मैं नहीं कर सके मौजूदा वर्ग में पॉइंटर प्राप्त करने का कोई तरीका नहीं है। और मैं दूसरे मॉड्यूल में कक्षा को फिर से नहीं बना सकता, क्योंकि वर्ग पहले से मौजूद है class_create
शून्य लौटाता है और device_create
द्वारा आवश्यक कक्षा में सूचक नहीं है। मैं में पाया:
http://lwn.net/Articles/102500/
एक समारोह है कि इसके नाम से एक वर्ग के लिए एक सूचक रिटर्न:
struct class * class_find(char * name)
हालांकि जब मैं समारोह संकलक यह मौजूद नहीं है का कहना है कि संकलित करने के लिए प्रयास करें। मैंने सोचा कि यह फ़ंक्शन कर्नेल द्वारा निर्यात किया गया था (मेरे मॉड्यूल में लाइसेंस जीपीएल है) लेकिन ऐसा लगता है कि यह नहीं है। शायद मुझे कुछ हेडर शामिल करने की आवश्यकता है?
मैंने इस फ़ंक्शन को फिर से लिखने का प्रयास किया, क्योंकि उसका कोड उपरोक्त लिंक में सूचीबद्ध है। लेकिन जब मैं के साथ class_subsys
से अधिक पुनरावृति करने की कोशिश:
list_for_each_entry(this_class, &class_subsys.kset.list, subsys.kset.kobj.entry)
अब प्रतीक class_subsys
नहीं मिला है। फिर मैंने सोचा कि यह कर्नेल को निर्यात किया जाता है।
मुझे यकीन नहीं है कि क्या गुम है। कुछ हेडर? क्या मैं इसे गलत तरीके से कर रहा हूं? ऐसा करने के लिए एक और कार्य है?
मुझे लगता है कि अगर मैं शुरुआत से sysfs
को पार कर सकता हूं तो मुझे मौजूदा कक्षा में पॉइंटर मिल सकता है। लेकिन मुझे यह भी नहीं मिला कि sysfs
ट्रैवर्सिंग कैसे शुरू करें। मेरे द्वारा देखे गए सभी कार्यों को ट्रैवर्सिंग शुरू करने के लिए kobject
या kset
पर पॉइंटर की आवश्यकता होती है। लेकिन मेरे पास sysfs
या कर्नेल ऑब्जेक्ट्स की जड़ तक कोई सूचक नहीं है, इसलिए मैं क्लास पॉइंटर प्राप्त करने के लिए पेड़ को घुमाने शुरू नहीं कर सकता।
क्या कोई मुझे सही दिशा में इंगित कर सकता है?
आपके द्वारा संदर्भित लिंक एक पैच का वर्णन करता है जो इसे कभी भी लिनक्स कर्नेल में नहीं बना देता - यही कारण है कि आप 'class_find' को कॉल करने में सक्षम नहीं हैं। यहां प्रासंगिक एलकेएमएल धागा है: https://lkml.org/lkml/2004/9/16/83। –
हाय, क्या आपने इस समस्या को हल किया है? मैं भी इस समस्या में फंस गया। – xianyu1337