हम बिल्ट-इन ड्राइवर लोड ऑर्डर को कैसे अनुकूलित कर सकते हैं (कुछ अंतर्निहित ड्राइवर मॉड्यूल लोड को पहले बनाने के लिए, और बाद में निर्भर मॉड्यूल लोड)?लिनक्स अंतर्निहित ड्राइवर लोड ऑर्डर क्या है?
उत्तर
बिल्ट-इन ड्राइवर लोड नहीं होंगे, इसलिए अंतर्निहित। उनके प्रारंभिक कार्यों को बुलाया जाता है और कर्नेल सक्रिय होने पर ड्राइवर सक्रिय होते हैं। इन init कार्यों को init/main.c::do_initcalls()
में बुलाया जाता है। सभी init कॉल का स्तर है, जो initcall_levels
में परिभाषित कर रहे हैं और include/linux/init.h
इन स्तरों actuall लिंकर लिपि (arch/*/kernel/vmlinux.lds.*
) में परिभाषित प्रतीक हैं में वर्गीकृत किया जाता है। कर्नेल संकलन समय पर, लिंकर module_init()
या अन्य *_initcall()
चिह्नित सभी फ़ंक्शंस एकत्र करता है, स्तरों में वर्गीकृत करता है, सभी कार्यों को एक ही स्तर पर एक ही स्तर पर एक साथ रखता है, और फ़ंक्शन पॉइंटर्स की एक सरणी बनाता है।
रन-टाइम में do_initcall_level() क्या करता है, प्रत्येक फ़ंक्शन को सरणी में पॉइंटर्स द्वारा इंगित किया जाता है। Do_initcall_level में, स्तरों को छोड़कर, कोई कॉलिंग नीति नहीं है, लेकिन सरणी में ऑर्डर लिंक समय में तय किया जाता है।
तो, अब आप देख सकते हैं कि चालक का दीक्षा आदेश लिंक समय पर तय किया गया है, लेकिन आप क्या कर सकते हैं?
- उच्च स्तर में अपने init समारोह में कहें, या
Makefile
पहले एक स्पष्ट है अगर आप उपरोक्त पढ़ा है में ऊंचे स्थान पर अपने डिवाइस ड्राइवर डाल दिया। यानी) अगर यह उचित है तो early_initcall() का उपयोग करें।
दूसरे को थोड़ा और स्पष्टीकरण की आवश्यकता है। Makefile
मामले में ऑर्डर यह है कि मौजूदा कर्नेल बिल्ड सिस्टम कैसे काम करता है और लिंकर्स कैसे काम करता है। एक लंबी कहानी कम करने के लिए, बिल्ड सिस्टम सभी ऑब्जेक्ट फ़ाइलों को obj-y
में ले जाता है और उन्हें एक साथ जोड़ता है। यह अत्यधिक पर्यावरण निर्भर है लेकिन उच्च संभावना है कि लिंकर पहले ऑब्जेक्ट फ़ाइल को obj-y
में निचले पते में रखता है, इस प्रकार, जिसे पहले कहा जाता था।
यदि आप चाहते हैं कि आपके ड्राइवर को उसी निर्देशिका में अन्य ड्राइवरों की तुलना में पहले बुलाया जाए, तो यह करने का सबसे आसान तरीका है।
depmod
प्रत्येक मॉड्यूल द्वारा निर्यात और आवश्यक प्रतीकों की जांच करता है और उन पर एक स्थलीय प्रकार करता है जो modprobe
बाद में उचित क्रम में मॉड्यूल लोड करने के लिए उपयोग कर सकते हैं। उन मॉड्यूल से प्रतीकों की आवश्यकता है जिन पर आप निर्भर होना चाहते हैं, यह सही चीज करने के लिए पर्याप्त है।
हाल ही में मुझे यह समस्या मिली है मेरे चार्जर ड्राइवर को एडीसी चालक पर निर्भरता है इसलिए एडीसी चालक चार्जर ड्राइवर लोड करने से पहले लोड किया गया है और डीटीएस फ़ाइल में परिभाषित एडीसी फंडाल की जांच कर रहा है और उसे एडीसी चालक द्वारा इंटिलाइज करना है। इसे ड्राइवर/मेकफ़ाइल
में मॉड्यूल के क्रम को बदलकर हल किया गया है, आपके बहुत विस्तार से स्पष्टीकरण के लिए @Yusushi Shoji धन्यवाद! –
यह एक उत्कृष्ट उत्तर का एक उदाहरण है! – VividD