2013-03-29 7 views
8

में अंतर-मॉड्यूल संचार मैं दो लिनक्स कर्नेल मॉड्यूल, जिनमें से एक दूसरे के लिए कुछ समारोह प्रदान कर सकता है है। लेकिन उस फ़ंक्शन का उपयोग आवश्यक नहीं है, दूसरा मॉड्यूल तब भी काम कर सकता है (और चाहिए) यदि पहला मॉड्यूल मौजूद न हो।लिनक्स कर्नेल

अगर मैं सिर्फ पहली मॉड्यूल से समारोह निर्यात और दूसरे मॉड्यूल में इसका इस्तेमाल करते हैं, दूसरे मॉड्यूल है कि प्रतीक पर निर्भर करता है और पहले मॉड्यूल के बिना लोड नहीं किया जा सकता है।

समाधान में से एक उपयोगकर्ता स्क्रिप्ट है कि पहली मॉड्यूल में समारोह लिये/proc/kallsym में लग रहा है के लिए है, और अगर यह वहाँ मौजूद है, स्क्रिप्ट दूसरे मॉड्यूल के लिए एक पैरामीटर है, जो तब बनाता है के रूप में अपनी पता गुजरता इसके बाहर सूचक। लेकिन मुझे स्पष्ट कारणों से उस समाधान को पसंद नहीं है।

अगर वहाँ अधिक सही और सुरुचिपूर्ण समाधान है कि दूसरे मॉड्यूल पहले मॉड्यूल में कुछ प्रतीक का पता प्राप्त जाते हैं, लेकिन मुश्किल निर्भरता से बचने की अनुमति देगा?

उत्तर

1

मैं अगर मॉड्यूल बी मॉड्यूल एक पर निर्भर करता है, मॉड्यूल बी सफलतापूर्वक मॉड्यूल एक के बिना लोड नहीं किया जा सकता है पहले भरी हुई है लगता है।

वास्तव में, के बाद ही मॉड्यूल एक पहला डाला, प्रतीकों जो मॉड्यूल बी की जरूरत है जो मॉड्यूल एक से निर्यात/proc/kallsym फ़ाइल में दिखाई देगा।

अपनी स्थिति का हल: मॉड्यूल बी में, module_init() फ़ंक्शन,, जाँच करने के लिए मॉड्यूल एक पहले से ही वहाँ है या नहीं है अगर नहीं लोड एक पहले कुछ कोड होना चाहिए। यानी A लोड, या try_then_request_module का उपयोग करने के लिए एक और अधिक फैंसी विधि बनाने के लिए request_module() का उपयोग करना()।

+0

मॉड्यूल बी को कोई मॉड्यूल ए नहीं होने पर भी काम करने की आवश्यकता है (मान लीजिए कि ए कुछ हार्डवेयर एक्सेल को इंटरफेस प्रदान करता है जो मशीन पर मौजूद नहीं है)। – Eugene

+0

query_module() 2.4 से लगभग सटीक मैं क्या जरूरत किया था में इंटरफेस था, लेकिन यह 2.6 में हटा दिया गया था। मुझे आश्चर्य है कि कुछ प्रतिस्थापन है ... – Eugene

5

अंततः मुझे समाधान मिला है: कर्नेल में symbol_get() और symbol_put() है जो मुझे किसी अन्य मॉड्यूल में मनमाने ढंग से प्रतीक देखने का मौका देता है (इसे निश्चित रूप से निर्यात किया जाना चाहिए) और मॉड्यूल को अनलोड करने से रोकें मैं इसके प्रतीक का उपयोग कर रहा हूँ।

1

अधिक सुरुचिपूर्ण समाधान देखते हैं लेकिन गिरी परिवर्तन की आवश्यकता है। असल में, कर्नेल को मॉड्यूल पंजीकरण के लिए बढ़ाया जाता है। जो सिर्फ कर्नेल सरणी कि पंजीकृत मॉड्यूल के लिए संदर्भ संग्रहीत करता है में एक सूचकांक है - जब एक मॉड्यूल लोड और अन्य मॉड्यूल के लिए खुद को बेनकाब करने के लिए चाहता है, वह एक प्रसिद्ध पूर्णांक के साथ कर्नेल में दर्ज किए जाएंगे। अब, किसी भी मॉड्यूल एक और मॉड्यूल के लिए एक संदर्भ प्राप्त करना चाहता है कि बस इस मॉड्यूल के लिए एक नया संदर्भ के लिए कर्नेल पूछना होगा - एक ही, जाने-माने पूर्णांक का उपयोग कर। इन नए संदर्भ अल्पकालिक चाहिए (यानी आप इसे करने के लिए एक संदर्भ मिलता है लेकिन उसी संदर्भ में इसे वापस कर दिया)। लंबे समय तक रहने वाले कनेक्शनों की अनुमति देने के लिए, आपको दोनों के बीच एक प्रोटोकॉल बनाना होगा ताकि जब मॉड्यूल अनलोड हो जाए तो वह जानता है कि वह दूसरे मॉड्यूल को कैसे सूचित कर रहा है कि वह दूर जा रहा है।

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