प्रिंटक आंतरिक रूप से कैसे काम करता है?


10

मुझे पता printfहै कि अपना काम करने के लिए ओएस से मदद चाहिए।

मुझे यह भी पता printfहै कि लिनक्स स्रोत कोड में काम नहीं करता है क्योंकि कोई पुस्तकालय नहीं है। और इसलिए हम printkडिबगिंग के लिए है।

printkजब ओएस अभी भी बूट हो रहा है तो कैसे काम करता है?

जवाबों:


11

यह संदर्भ आपके सवालों के जवाब देता है, जिसका शीर्षक है: लिनक्स कर्नेल डेवलपमेंट सेकंड एडिशन

अंश

printk ()

कर्नेल प्रिंट फ़ंक्शन, printk()C लाइब्रेरी printf()फ़ंक्शन के लिए लगभग समान रूप से व्यवहार करता है। वास्तव में, इस पुस्तक में हमने किसी भी वास्तविक अंतर का उपयोग नहीं किया है। अधिकांश इरादों के लिए, यह ठीक है; printk()बस कर्नेल के स्वरूपित प्रिंट फ़ंक्शन का नाम है। हालांकि इसमें कुछ अंतर हैं।

प्रिंट की लूट ()

printk()जल्दी से दी गई संपत्ति की एक संपत्ति इसकी मजबूती है। printk()समारोह बस के बारे में किसी भी समय गिरी में कहीं से भी प्रतिदेय है। इसे रुकावट या प्रक्रिया के संदर्भ से बुलाया जा सकता है। ताला लगा रहने पर इसे बुलाया जा सकता है। इसे कई प्रोसेसर पर एक साथ कहा जा सकता है, फिर भी इसमें कॉल करने वाले को लॉक रखने की आवश्यकता नहीं होती है।

यह एक लचीला कार्य है। यह महत्वपूर्ण है क्योंकि इस printk()तथ्य पर टिकी हुई है कि यह हमेशा रहता है और हमेशा काम करता है।

प्रिंटक की गैर-व्यावसायिकता ()

कवच की printk()मजबूती में एक झंकार मौजूद है। यह कर्नेल बूट प्रक्रिया में एक निश्चित बिंदु से पहले अनुपयोगी है, आरंभिक सांत्वना से पहले। दरअसल, यदि कंसोल को इनिशियलाइज़ नहीं किया जाता है, तो आउटपुट कहाँ जाना है?

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

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

समाधान एक ऐसा printk()संस्करण है जो बूट प्रक्रिया में बहुत जल्दी कंसोल को आउटपुट कर सकता है early_printk():। व्यवहार वैसा ही है printk(), जैसे केवल नाम और पहले काम करने की क्षमता बदल जाती है। हालांकि, यह एक पोर्टेबल समाधान नहीं है, क्योंकि सभी समर्थित आर्किटेक्चर के पास ऐसी कोई विधि नहीं है। यह आपका सबसे अच्छा दोस्त बन सकता है, हालांकि, अगर ऐसा होता है।

जब तक आपको बूट प्रक्रिया में बहुत जल्दी कंसोल को लिखने की आवश्यकता नहीं है, आप printk()हमेशा काम करने के लिए भरोसा कर सकते हैं ।


4

जब OS अभी भी बूट हो रहा है तो PrintK कैसे काम करता है?

printk()यदि संभव हो तो कंसोल जाता है और प्राथमिकता काफी अधिक है; मुझे इस बात पर यकीन नहीं है कि कर्नेल किस बिंदु को शुरू करने के लिए वीटीएस बनाता है लेकिन यह स्पष्ट रूप से काफी शुरुआती है।

[src]/kernel/printk/printk.cबहुत अच्छी तरह से प्रलेखित है। कंसोल पहुंच सेमीफॉरेस के माध्यम से नियंत्रित होती है। संदेश को /dev/dmsgप्राथमिकता के बावजूद भी इंजेक्ट किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.