2013-08-28 23 views
6

मैं लिनक्स के लिए एक लोड करने योग्य कर्नेल मॉड्यूल लिख रहा हूं। और मुझे लिनक्स कर्नेल में प्रत्येक कार्य के लिए कुछ डेटा स्टोर करने की आवश्यकता है (ये डेटा शेड्यूलर कॉलबैक में उपयोग किया जाएगा)।प्रति-कार्य डेटा संरचना

मुझे पता है कि मैं struct task_struct संशोधित कर सकता हूं और अपने स्वयं के फ़ील्ड डाल सकता हूं। लेकिन चूंकि मैं अपेक्षाकृत लिखने के लिए तैयार हूं कर्नेल मॉड्यूल, मैं मूल लिनक्स स्रोत पेड़ में मौजूद किसी भी कोड को संशोधित नहीं कर सकता।

हैश तालिका में मेरे डेटा में struct task_struct से कुछ प्रकार के मैपिंग को बनाए रखना भी संभव है। लेकिन यह थोड़ा बहुत भारी वजन प्रतीत होता है।

मैंने Thread local data in linux kernel module में उत्तर पढ़ा है। इसने का उपयोग struct file में किया है। लेकिन इसे struct file प्राप्त करने के लिए इसे खोलने के लिए प्रत्येक थ्रेड की आवश्यकता है। और struct task_struct के साथ प्रति-कार्य डेटा क्वेरी करने का कोई तरीका नहीं है। (जैसा कि मुझे शेड्यूलर कॉलबैक में डेटा का उपयोग करने की आवश्यकता है)

मेरा प्रश्न है: क्या कोई आसान और साफ तरीका है जो मुझे struct task_struct संशोधित किए बिना लिनक्स कर्नेल में प्रति-कार्य डेटा-संरचना पंजीकृत करने की अनुमति देता है?

बहुत धन्यवाद!

+0

प्रति कार्य डेटा क्या है और आपका मॉड्यूल वास्तव में क्या कर रहा है? बहुत कुछ समझाओ! –

+0

@ बेसिल स्टैरेनकेविच मुझे कर्नेल में प्रत्येक 'task_struct' के लिए कुछ डेटा स्टोर करने की आवश्यकता है। और इन आंकड़ों को शेड्यूल करने के दौरान एक्सेस किया जा सकता है। कल्पना कीजिए कि मैं एक मॉड्यूल लिख रहा हूं जो प्रत्येक धागे के लिए # संदर्भ-स्विच की गणना करता है (मुझे पता है कि यह कार्यक्षमता मूल कर्नेल में मौजूद है, इसलिए यह सिर्फ एक उदाहरण है। यह समझाना मुश्किल है कि मेरे मॉड्यूल वास्तव में कुछ शब्दों में स्पष्ट रूप से क्या कर रहा है।) – Naruil

+0

@ Naruil: आप यह कहने के लिए एक पूरा सवाल है। बहुत कम कर्नेल मॉड्यूल को वास्तव में प्रति-प्रक्रिया डेटा का ट्रैक रखने की आवश्यकता होती है; यदि आप कह सकते हैं कि इसकी आवश्यकता क्यों है, तो यह स्पष्ट होगा कि आगे कैसे बढ़ना है। – nneonneo

उत्तर

2

एकमात्र सरल और साफ तरीका जो आपको एक प्रति-कार्य डेटा संरचना पंजीकृत करने की अनुमति देता है struct task_struct को संशोधित करना है।

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

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