जवाबों:
यह संदर्भ आपके सवालों के जवाब देता है, जिसका शीर्षक है: लिनक्स कर्नेल डेवलपमेंट सेकंड एडिशन ।
अंश
printk ()
कर्नेल प्रिंट फ़ंक्शन,
printk()
C लाइब्रेरीprintf()
फ़ंक्शन के लिए लगभग समान रूप से व्यवहार करता है। वास्तव में, इस पुस्तक में हमने किसी भी वास्तविक अंतर का उपयोग नहीं किया है। अधिकांश इरादों के लिए, यह ठीक है;printk()
बस कर्नेल के स्वरूपित प्रिंट फ़ंक्शन का नाम है। हालांकि इसमें कुछ अंतर हैं।प्रिंट की लूट ()
printk()
जल्दी से दी गई संपत्ति की एक संपत्ति इसकी मजबूती है।printk()
समारोह बस के बारे में किसी भी समय गिरी में कहीं से भी प्रतिदेय है। इसे रुकावट या प्रक्रिया के संदर्भ से बुलाया जा सकता है। ताला लगा रहने पर इसे बुलाया जा सकता है। इसे कई प्रोसेसर पर एक साथ कहा जा सकता है, फिर भी इसमें कॉल करने वाले को लॉक रखने की आवश्यकता नहीं होती है।यह एक लचीला कार्य है। यह महत्वपूर्ण है क्योंकि इस
printk()
तथ्य पर टिकी हुई है कि यह हमेशा रहता है और हमेशा काम करता है।प्रिंटक की गैर-व्यावसायिकता ()
कवच की
printk()
मजबूती में एक झंकार मौजूद है। यह कर्नेल बूट प्रक्रिया में एक निश्चित बिंदु से पहले अनुपयोगी है, आरंभिक सांत्वना से पहले। दरअसल, यदि कंसोल को इनिशियलाइज़ नहीं किया जाता है, तो आउटपुट कहाँ जाना है?यह आम तौर पर एक मुद्दा नहीं है, जब तक कि आप बूट प्रक्रिया में बहुत जल्दी मुद्दों को डिबग नहीं कर रहे हैं (उदाहरण के लिए
setup_arch()
, जो वास्तुकला-विशिष्ट आरंभीकरण करता है)। इस तरह के डिबगिंग के साथ शुरू करने के लिए एक चुनौती है, और किसी भी प्रकार की प्रिंट विधि की अनुपस्थिति केवल समस्या को कम करती है।कुछ आशा है, लेकिन बहुत कुछ नहीं। हार्डकोर आर्किटेक्चर हैकर्स बाहरी दुनिया के साथ संवाद करने के लिए काम करने वाले हार्डवेयर (कहते हैं, एक सीरियल पोर्ट) का उपयोग करते हैं। मेरा विश्वास करो यह ज्यादातर लोगों के लिए मजेदार नहीं है। कुछ समर्थित आर्किटेक्चर एक सनी समाधान को लागू करते हैं, हालांकि और अन्य (i386 शामिल) में पैच उपलब्ध हैं जो दिन को भी बचाते हैं।
समाधान एक ऐसा
printk()
संस्करण है जो बूट प्रक्रिया में बहुत जल्दी कंसोल को आउटपुट कर सकता हैearly_printk()
:। व्यवहार वैसा ही हैprintk()
, जैसे केवल नाम और पहले काम करने की क्षमता बदल जाती है। हालांकि, यह एक पोर्टेबल समाधान नहीं है, क्योंकि सभी समर्थित आर्किटेक्चर के पास ऐसी कोई विधि नहीं है। यह आपका सबसे अच्छा दोस्त बन सकता है, हालांकि, अगर ऐसा होता है।जब तक आपको बूट प्रक्रिया में बहुत जल्दी कंसोल को लिखने की आवश्यकता नहीं है, आप
printk()
हमेशा काम करने के लिए भरोसा कर सकते हैं ।
जब OS अभी भी बूट हो रहा है तो PrintK कैसे काम करता है?
printk()
यदि संभव हो तो कंसोल जाता है और प्राथमिकता काफी अधिक है; मुझे इस बात पर यकीन नहीं है कि कर्नेल किस बिंदु को शुरू करने के लिए वीटीएस बनाता है लेकिन यह स्पष्ट रूप से काफी शुरुआती है।
[src]/kernel/printk/printk.c
बहुत अच्छी तरह से प्रलेखित है। कंसोल पहुंच सेमीफॉरेस के माध्यम से नियंत्रित होती है। संदेश को /dev/dmsg
प्राथमिकता के बावजूद भी इंजेक्ट किया जाता है।