2010-03-16 17 views
12

मैं अगर कोई संसाधन उपलब्ध ऑनलाइन है कि बताते हैं क्या, कुछ के साथ होता है सी के printf की तरह, बताते हैं कि क्या बहुत कम स्तर में हो रहा है (BIOS/गिरी कॉल)printf के हार्डवेयर

उत्तर

23

लिनक्स पर यह डीएल कर सकते हैं: सी पुस्तकालय में सी पुस्तकालय में

printf() ---> printf() ---> लिखने() ---> लिखने () कर्नेल में सिस्टम कॉल।

उपयोगकर्ता स्थान और कर्नेल स्पेस के बीच इंटरफ़ेस को समझने के लिए, आपको system calls कार्य के बारे में कुछ जानकारी होगी।

निम्नतम स्तरों पर क्या हो रहा है, यह समझने के लिए, आपको kernel में स्रोत कोड का विश्लेषण करने की आवश्यकता होगी।

Linux system call quick reference (पीडीएफ लिंक) उपयोगी हो सकता है क्योंकि यह पहचानता है कि कर्नेल स्रोत में आप कहां दिखना शुरू कर सकते हैं।

+2

+1, शानदार उत्तर। –

+1

[शत्रुतापूर्ण फोर्क के उत्तर] पर ठोकर खाने के बाद (http://stackoverflow.com/questions/2442966/cc-function-definitions-without-assembly/2444508#2444508) [सी/सी ++ असेंबली के बिना फ़ंक्शन परिभाषा] (http://stackoverflow.com/questions/2442966/cc-function-definitions-without-assembly/2444508), मुझे लगता है कि यह मेरे से बेहतर है। – jschmier

0

था सोच रहा था को समझना ऐसा करने के लिए एक अच्छा अभ्यास हालांकि लिनक्स कर्नेल के माध्यम से कॉल का पता लगाना मुश्किल होगा। आप http://www.kernel.org/

1

यह बहुत ही मंच-विशिष्ट है। एक हार्डवेयर दृष्टिकोण से, printf (के पीछे के अंत कार्यान्वयन) एक सीरियल पोर्ट के लिए निर्देशित किया जा सकता है, एक गैर धारावाहिक एलसीडी, आदि आप वास्तव में दो सवाल पूछ रहे हैं:

  1. printf है कैसे() सही आउटपुट उत्पन्न करने के लिए तर्क और प्रारूप स्ट्रिंग की व्याख्या करें?

  2. आउटपुट प्रिंटफ() से आपके लक्षित डिवाइस पर कैसे मिलता है?

आपको याद रखना चाहिए कि किसी एप्लिकेशन को कार्य करने के लिए ओएस, कर्नेल और BIOS की आवश्यकता नहीं है। एम्बेडेड ऐप्स में आमतौर पर printf() और अन्य आईओ रूटीन एक वर्ण रिंग बफर को लिखते हैं। तब एक बाधा उत्पन्न हो सकती है कि सही गंतव्य पर buffered आउटपुट भेजने के लिए आउटपुट हार्डवेयर (एलसीडी, सीरियल पोर्ट, लेजर शो, आदि) को बफर और हेरफेर करें।

1

परिभाषा के अनुसार, BIOS और कर्नेल कॉल प्लेटफ़ॉर्म-विशिष्ट हैं। आप किस प्लेटफॉर्म में रूचि रखते हैं? लिनक्स से संबंधित जानकारी के कई लिंक पहले ही पोस्ट किए जा चुके हैं।

यह भी ध्यान दें कि printf किसी भी BIOS या कर्नेल कॉल का परिणाम भी नहीं हो सकता है, क्योंकि आपके प्लेटफ़ॉर्म में कर्नेल या BIOS मौजूद नहीं हो सकता है (एम्बेडेड सिस्टम इसका एक अच्छा उदाहरण हैं)।

3

कुछ printf, या printf विशेष रूप से? यह कुछ अस्पष्ट है।

stdout FILE * स्ट्रीम में printf आउटपुट; जो सिस्टम से जुड़ा हुआ है वह सिस्टम निर्भर है और इसके अलावा किसी अन्य स्ट्रीम डिवाइस पर रीडायरेक्ट किया जा सकता है जिसके लिए ओएस एक उपयुक्त डिवाइस ड्राइवर प्रदान करता है। मैं एम्बेडेड सिस्टम में काम करता हूं, और अक्सर स्टडआउट डिफ़ॉल्ट रूप से सीरियल I/O के लिए यूएआरटी को निर्देशित किया जाता है - अक्सर यह एकमात्र धारा I/O डिवाइस समर्थित है, और इसे पुनर्निर्देशित नहीं किया जा सकता है। कंसोल मोड अनुप्रयोगों के लिए एक जीयूआई ओएस में, आउटपुट टर्मिनल फ़ॉन्ट में विंडो में ग्राफिक रूप से 'खींचा गया' होता है, उदाहरण के लिए इसमें जीडीआई या डायरेक्टड्रा कॉल शामिल हो सकते हैं, जो बदले में वीडियो हार्डवेयर के डिवाइस ड्राइवर तक पहुंच सकता है।एक आधुनिक डेस्कटॉप ओएस पर, कंसोल वर्ण आउटपुट में प्रारंभिक बूटस्ट्रैपिंग के अलावा अन्य सभी में BIOS शामिल नहीं है।

तो संक्षेप में, आमतौर पर एक printf() कॉल और हार्डवेयर के बीच एक बड़ी मात्रा में सॉफ़्टवेयर होता है जिस पर यह आउटपुट होता है।

0

printf() एकाधिक तर्क लेता है (परिवर्तनीय लंबाई तर्क फ़ंक्शन)। उपयोगकर्ता एक स्ट्रिंग और इनपुट तर्क प्रदान करता है।

printf() फ़ंक्शन आउटपुट स्ट्रिंग बनाने के लिए एक आंतरिक बफर बनाता है। अब, printf() उपयोगकर्ता स्ट्रिंग के प्रत्येक वर्ण के माध्यम से पुनरावृत्त करता है और चरित्र को आउटपुट स्ट्रिंग में प्रतिलिपि बनाता है। Printf() केवल "%" पर रुक जाता है।

"%" का अर्थ है बदलने के लिए एक तर्क है (तर्क चार, int, long, float, double या string के रूप में हैं)। यह इसे स्ट्रिंग में परिवर्तित करता है और आउटपुट बफर में जोड़ता है। यदि तर्क एक स्ट्रिंग है तो यह एक स्ट्रिंग प्रति करता है।

अंत में, printf() उपयोगकर्ता स्टिंग के अंत तक पहुंच सकता है और यह पूरे बफर को stdout फ़ाइल में कॉपी करता है।