2017-03-22 13 views
5

यह प्रश्न लिनक्स कर्नेल 4.10 के बारे में है।लोड करने योग्य कर्नेल मॉड्यूल को पेड़ के रूप में चिह्नित करना

लोड हो रहा है एक बाहर के पेड़ लाइन किमी गिरी का कारण बनता है एक चेतावनी मुद्रित करने के लिए:

module: loading out-of-tree module taints kernel.

यह module.c में इस चेक से उठाती है: if (!get_modinfo(info, "intree")) {

पढ़ना get_modinfo यह seams कि "intree ".ko फ़ाइल के अंदर सिर्फ ए जादू-स्ट्रिंग livnig है।

एक यादृच्छिक लाइन किमी मैं अपने सिस्टम में पाया पर readelf चल रहा है इस से पता चलता:

readelf -a imon.ko | grep intree 161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1

जबकि intree की तलाश में एक सरल, कस्टम hello_world लाइन किमी में देता कोई परिणाम नहीं।

क्या यह वास्तव में मामला है?

कुछ मॉड्यूल कैसे पेड़ के रूप में चिह्नित हैं? क्या यह मॉड्यूल (जैसे MODULE_LICENCE) में मैक्रो जोड़कर किया जाता है, या मॉड्यूल को किसी विशिष्ट तरीके से या कुछ और बनाकर किया जाता है?

+0

आप पेड़ के रूप में बाहर के पेड़ मॉड्यूल को क्यों चिह्नित करना चाहते हैं? यह सब करने जा रहा है कर्नेल डेवलपर्स परेशान है। – duskwuff

उत्तर

4

संक्षेप में, निर्माण प्रणाली "modulename .mod.c" फ़ाइल यदि और केवल यदि मॉड्यूल बनाया जा रहा है intree करने के लिए लाइन MODULE_INFO(intree, "Y"); जोड़ने के लिए contrives।

उस मॉड्यूल की नियमित ".c" फ़ाइलों में से किसी एक को उस पंक्ति को जोड़कर सिस्टम को मूर्ख बनाने का एक स्पष्ट तरीका है, लेकिन मुझे यकीन नहीं है कि आप क्यों चाहते हैं।

अधिक बड़ा संस्करण ....

बाहरी मॉड्यूल सामान्य रूप से एक आदेश इस के समान के साथ निर्माण कर रहे हैं:

$ make M=`pwd` modules 

या पुराने वाक्य रचना:

$ make SUBDIRS=`pwd` modules 

एक गैर की उपस्थिति या SUBDIRSKBUILD_EXTMOD चर सेट करने के लिए कर्नेल के शीर्ष-स्तर "मेकफ़ाइल" का कारण बनता है। यह एक सामान्य कर्नेल निर्माण के लिए सेट नहीं किया जाएगा।

मॉड्यूल भवन के चरण 2 के लिए (जब संदेश "बिल्डिंग मॉड्यूल, चरण 2" आउटपुट होता है), "स्क्रिप्ट/मेकफ़ाइल.मोडपोस्ट" मेकफ़ाइल चलाता है। यह सेट होने पर विभिन्न विकल्पों के साथ scripts/mod/modpost चलाता है। विशेष रूप से, -I विकल्प का उपयोग तब किया जाता है जब KBUILD_EXTMOD सेट किया गया है।

"लिपियों/आधुनिक/modpost.c" में modpost के लिए स्रोत को देखते हुए, external_module चर 0 के एक प्रारंभिक मूल्य है, लेकिन -I विकल्प यह 1. करने के लिए सेट समारोह add_intree_flag() दूसरा पैरामीटर is_intree साथ कहा जाता है !external_module पर सेट करें। add_intree_flag() फ़ंक्शन MODULE_INFO(intree, "Y"); को "मॉड्यूलनाम .mod.c" लिखता है, अगर फ़ाइल और केवल is_intree पैरामीटर सत्य है।

तो intree मॉड्यूल और बाहरी मॉड्यूल के बीच अंतर "modulename .mod.c" फ़ाइल में MODULE_INFO(intree, "Y"); मैक्रो कॉल की उपस्थिति है। यह "मॉड्यूलनाम .mod.o" और "मॉड्यूल की अन्य ऑब्जेक्ट फ़ाइलों से" मॉड्यूलनाम .ko "फ़ाइल बनाने के लिए संकलित हो जाता है।

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