2010-07-09 11 views
41

मैंने "लिनक्स कर्नेल को समझना" पुस्तक पढ़ने के दौरान इन्हें & में निर्देशों के लिए एनकॉउट किया है। मैंने संदर्भ मैनुअल देखा है।x86 में इन और आउट निर्देशों के लिए क्या उपयोग किया जाता है?

5.1.9 आई/ओ निर्देश

ये निर्देश प्रोसेसर की आई/ओ पोर्ट और एक रजिस्टर या स्मृति के बीच डेटा स्थानांतरित।

IN Read from a port 
OUT Write to a port 
INS/INSB Input string from port/Input byte string from port 
INS/INSW Input string from port/Input word string from port 
INS/INSD Input string from port/Input doubleword string from port 
OUTS/OUTSB Output string to port/Output byte string to port 
OUTS/OUTSW Output string to port/Output word string to port 
OUTS/OUTSD Output string to port/Output doubleword string to port 

मैं कुछ चीजें नहीं मिला:

  1. "प्रोसेसर के आई/ओ पोर्ट"। वे क्या हैं? हम & इन पोर्टों से & पर "तार" लिखना क्यों चाहते हैं?
  2. मैंने कभी भी एक scenerio encoutered जहां मुझे इन निर्देशों का उपयोग करने की जरूरत है। मुझे इनकी आवश्यकता कब होगी?
  3. कुछ व्यावहारिक उदाहरण दें।

उत्तर

62

आप जानते हैं कि मेमोरी एड्रेसिंग कैसे काम करती है? एक पता बस, एक डेटा बस, और कुछ नियंत्रण लाइनें हैं। सीपीयू पता बस पर स्मृति के बाइट (या शुरुआत बाइट) का पता रखता है, फिर रीड सिग्नल उठाता है, और कुछ रैम चिप उम्मीदवारों को अलग-अलग लाइनों को बढ़ाकर या कम करके उस पते पर स्मृति की सामग्री लौटाता है (बिट्स के अनुरूप बाइट में) डेटा बस पर। यह रैम और रॉम दोनों के लिए काम करता है।

लेकिन फिर आई/ओ डिवाइस भी हैं: सीरियल और समांतर बंदरगाह, पीसी के छोटे आंतरिक स्पीकर, डिस्क नियंत्रक, ध्वनि चिप्स आदि के लिए ड्राइवर। और उन उपकरणों को भी पढ़ा और लिखा है। उन्हें संबोधित करने की भी आवश्यकता है ताकि सीपीयू किसी दिए गए डिवाइस के भीतर सही डिवाइस और (आमतौर पर) सही डेटा स्थान तक पहुंच सके।

कुछ "आधुनिक" पीसी में पाए गए xxx86 श्रृंखला सहित कुछ CPU मॉडल के लिए, I/O डिवाइस स्मृति स्थान के साथ पता स्थान साझा करते हैं। रैम/रोम और आईओ डिवाइस दोनों एक ही पते, डेटा और नियंत्रण लाइनों से जुड़े हुए हैं। उदाहरण के लिए, COM1 के लिए सीरियल पोर्ट को (हेक्स) 03F8 से शुरू किया गया है। लेकिन एक ही पते पर लगभग निश्चित रूप से स्मृति है।

[https://qph.ec.quoracdn.net/main-qimg-e510d81162f562d8f671d5900da84d68-c?convert_to_webp=true]

जाहिर सीपीयू या तो स्मृति या आई/ओ डिवाइस, कभी नहीं दोनों से बात करने की जरूरत है:

यहाँ एक बहुत आसान आरेख है। दोनों के बीच अंतर करने के लिए, "एम/# आईओ" नामक नियंत्रण रेखाओं में से एक यह दावा करता है कि क्या सीपीयू मेमोरी (लाइन = उच्च) या आई/ओ डिवाइस (लाइन = कम) से बात करना चाहता है या नहीं।

IN निर्देश एक I/O डिवाइस से पढ़ता है, आउट लिखता है। जब आप इन या आउट निर्देशों का उपयोग करते हैं, तो एम/# आईओ पर जोर नहीं दिया जाता है (कम रखा जाता है), इसलिए स्मृति प्रतिक्रिया नहीं देती है और आई/ओ चिप करता है। स्मृति-उन्मुख निर्देशों के लिए, एम/# आईओ को रैम में सीपीयू वार्ता का जोर दिया जाता है, और आईओ डिवाइस संचार से बाहर रहते हैं।

कुछ शर्तों के तहत आईओ डिवाइस डेटा लाइनों को ड्राइव कर सकते हैं और रैम एक ही समय में उन्हें पढ़ सकता है। और इसके विपरीत। इसे डीएमए कहा जाता है।

परंपरागत रूप से, सीरियल और प्रिंटर बंदरगाहों के साथ-साथ कीबोर्ड, माउस, तापमान सेंसर और आगे के I/O डिवाइस थे।डिस्क के बीच में थे; डाटा ट्रांसफर I/O कमांड द्वारा शुरू किया जाएगा लेकिन डिस्क नियंत्रक आमतौर पर सिस्टम मेमोरी में अपने डेटा को सीधे जमा कर देगा।

विंडोज या लिनक्स जैसे आधुनिक ऑपरेटिंग सिस्टम में, I/O बंदरगाहों तक पहुंच "सामान्य" उपयोगकर्ता प्रोग्राम से छिपी हुई है, और हार्डवेयर से निपटने के लिए सॉफ़्टवेयर, विशेषाधिकार प्राप्त निर्देश और ड्राइवर की परतें हैं। तो इस शताब्दी में, अधिकांश प्रोग्रामर उन निर्देशों से निपटते नहीं हैं।

+0

क्या आप एक पुस्तक को पुनः प्राप्त कर सकते हैं जहां मैं इसके बारे में अधिक पढ़ सकता हूं? आपका जवाब बहुत अच्छा है! –

+0

मुझे लगता है कि मैंने लगभग 30 साल पहले अपने विश्वविद्यालय में कंप्यूटर आर्किटेक्चर कोर्स में ज्यादातर चीजें सीखी थीं; इसलिए मैं एक पुस्तक उद्धृत नहीं कर सकता _I_ को यह सामान मिला, क्षमा करें! हालांकि, कुछ प्रासंगिक खोजशब्दों के लिए गुगलिंग, मैंने उनमें से कई को एक पुस्तक में एक पृष्ठ पर पाया: http://www.amazon.com/Microprocessors-Microcomputer- आधारित- सिस्टम- मोहम्मद- राफिकज़मान/डीपी/0849344751 I पुस्तक के बारे में आपको कुछ भी नहीं बता सकता है सिवाय इसके कि यह 1 99 5 से है और मैं खुद को $ 14 9 का भुगतान नहीं कर सका। सचमुच में, आपका माइलेज अलग अलग हो सकता है। –

+0

ठीक है। इस स्पष्टीकरण के लिए धन्यवाद। मैं लंबे समय से आईओ अंतरिक्ष की धारणा से उलझन में हूं क्योंकि मुझे एमएमआईओ के साथ कड़ाई से सिखाया गया था। तथ्य यह है कि स्मृति और आईओ को खुद को संबोधित करने के बारे में सोचा जा सकता है, इसे जल्द से जल्द समझने के लिए मुझे थोड़ा शर्मिंदा नहीं किया जाता है। – sherrellbc

0

सीपीयू कब बंदरगाहों के माध्यम से कुछ बाहरी नियंत्रक से जुड़ा है। पुराने x86 पीसी पर मैं आई/ओ बंदरगाहों का उपयोग कर फ्लॉपी ड्राइव के साथ काम करता हूं। यदि आप जानते हैं कि कौन से आदेश डिवाइस नियंत्रक को स्वीकार करते हैं तो आप इसे अपने बंदरगाहों के माध्यम से प्रोग्राम कर सकते हैं।

आधुनिक दुनिया में आप बंदरगाहों निर्देशों का उपयोग कभी नहीं होगा। अपवाद अगर आप ड्राइवर डेवलपर हैं (या होगा)।

वहाँ मैं/हे बंदरगाहों http://webster.cs.ucr.edu/AoA/DOS/ch03/CH03-6.html#HEADING6-1

3

आप एक ऑपरेटिंग सिस्टम है, तो आप इन निर्देशों का उपयोग कभी नहीं होगा लेखन नहीं कर रहे हैं के बारे में अधिक विस्तृत जानकारी है। स्मृति पता स्थान जिससे आप परिचित हैं, और उसके बाद आई/ओ पता स्थान -

x86- आधारित मशीनों दो स्वतंत्र पता रिक्त स्थान है। I/O पोर्ट पते केवल 16 बिट चौड़े हैं, और संदर्भ निम्न-स्तर वाले रजिस्ट्रार और अन्य निम्न-स्तरीय विजेट जो I/O डिवाइस का हिस्सा हैं - एक सीरियल या समांतर बंदरगाह, डिस्क नियंत्रक, आदि जैसे कुछ

कोई व्यावहारिक उदाहरण नहीं हैं क्योंकि इन्हें केवल डिवाइस ड्राइवरों और ऑपरेटिंग सिस्टम द्वारा उपयोग किया जाता है।

+5

यदि आप ड्राइवर लिख रहे हैं तो निश्चित रूप से उनका उपयोग किया जा सकता है। – Jay

+0

http://webster.cs.ucr.edu/AoA/DOS/ch03/CH03-1.html#HEADING1-76 – claws

+1

@ डाउनवॉटर: तो आप लोगों को क्यों नहीं बताते कि समस्या क्या है? –

3

हार्डवेयर स्तर पर, अधिकांश माइक्रोप्रोसेसरों में कम या कोई I/O क्षमता नहीं होती है। कुछ प्रोसेसर में एक या अधिक पिन होते हैं जिन्हें विशेष निर्देशों का उपयोग करके चालू और बंद किया जा सकता है, और/या एक या अधिक पिन जो हो सकते हैं विशेष शाखा निर्देशों का उपयोग करके परीक्षण किया जाए, लेकिन ऐसी विशेषताएं दुर्लभ हैं। इसके बजाए, I/O को आमतौर पर सिस्टम को तारों से संभाला जाता है ताकि मेमोरी पतों की एक श्रृंखला तक पहुंचने से कुछ प्रभाव पड़ेगा, या "इन" और "आउट" निर्देशों को शामिल किया जाएगा जो स्मृति लोड/स्टोर ऑपरेशंस की तरह व्यवहार करते हैं, सिवाय इसके कि एक विशेष सिग्नल आउटपुट कह रहा है "यह एक मेमोरी ऑपरेशन के बजाय एक I/O ऑपरेशन है।" 16-बिट प्रोसेसर के दिनों में, विशेष इन/आउट निर्देशों के लिए कुछ वास्तविक फायदे होते थे। आजकल ऐसे फायदे बड़े पैमाने पर मंथन कर रहे हैं क्योंकि कोई व्यक्ति आई/ओ को किसी के पता स्थान के बड़े हिस्से को आवंटित कर सकता है और अभी भी स्मृति के लिए बहुत कुछ बचा है।

चूंकि कोई प्रोग्राम अनुचित रूप से प्रदर्शन I/O निर्देशों (जैसे ऐसे निर्देश मनमाने ढंग से डिस्क एक्सेस कर सकते हैं) द्वारा सिस्टम पर काफी हड़ताली हो सकता है, इसलिए सभी आधुनिक ऑपरेटिंग सिस्टम उपयोगकर्ता-स्तर कोड में ऐसे निर्देशों के उपयोग को रोकते हैं। कुछ सिस्टम ऐसे निर्देशों को वर्चुअलाइज्ड करने की अनुमति दे सकते हैं; यदि उपयोगकर्ता कोड I/O बंदरगाहों 0x3D4 और 0x3D5 को लिखने का प्रयास करता है, उदाहरण के लिए, एक ऑपरेटिंग सिस्टम कुछ वीडियो-नियंत्रण नियंत्रण रजिस्टरों को ब्लिंकिंग कर्सर को स्थानांतरित करने के प्रयास के रूप में व्याख्या कर सकता है। प्रत्येक बार जब उपयोगकर्ता प्रोग्राम ने आउट निर्देश का प्रदर्शन किया, तो ऑपरेटिंग सिस्टम खत्म हो जाएगा, देखें कि उपयोगकर्ता प्रोग्राम क्या करने का प्रयास कर रहा था, और उचित तरीके से कार्य करता था।

अधिकांश मामलों में, भले ही ऑपरेटिंग सिस्टम एक उपयुक्त या कुछ निर्देश में अनुवाद का अनुवाद करे, फिर भी ऑपरेटिंग सिस्टम से उचित कार्रवाई का अनुरोध करना अधिक कुशल होगा।

कुछ इस तरह के साथ
22

प्रारंभ:

http://www.cpu-world.com/info/Pinouts/8088.html

आप एक बहुत पुरानी प्रौद्योगिकी चिप/वास्तुकला के लिए निर्देश सीख रहे हैं। वापस जब सब कुछ प्रोसेसर कोर चिप से बंद था।पता रेखाएं और डेटा लाइनें देखें और आरडी रीड लाइन और डब्ल्यूआर राइट लाइन और आईओ/एम लाइन है?

निर्देश आधारित स्मृति के दो प्रकार के होते थे और मैं/हे आधारित क्योंकि वहाँ पता रिक्त स्थान, आसानी से आईओ/एम आईओ या मेमोरी द्वारा डिकोड।

याद रखें कि आप 74LSxx गोंद तर्क था, तारों और चिप्स के बहुत सारे के बहुत सारे प्रोसेसर के लिए एक स्मृति कनेक्ट करने के लिए। और स्मृति बस उस स्मृति, बड़े महंगे चिप्स था। यदि आपके पास परिधीय था, तो कुछ भी उपयोगी करने के लिए आपके पास नियंत्रण रजिस्ट्रार भी थे, मेमोरी पिक्सेल डेटा हो सकती है, लेकिन कहीं आपको क्षैतिज और लंबवत स्कैन घड़ियों की सीमा निर्धारित करने की आवश्यकता होती है, ये व्यक्तिगत 74LSxx latches, यादें नहीं हो सकतीं,/ओ मैप किए गए I/O दोनों गोंद तर्क पर सहेजे गए हैं और प्रोग्रामर परिप्रेक्ष्य से बहुत अधिक समझ में आ गए हैं, यह आपके सेगमेंट रजिस्टरों को बदलने के लिए भी आपकी 64K मेमोरी विंडो को लक्षित करने से बचने से बचा है। मेमोरी एड्रेस स्पेस एक पवित्र संसाधन था, esp जब आप अपने बिट डिकोडिंग को कुछ बिट्स तक सीमित करना चाहता था क्योंकि प्रत्येक कुछ बिट्स आपको कई चिप्स और तारों की कीमत लेते थे।

बड़ी और छोटी एंडियन मेमोरी मैप किए गए I/O बनाम I/O मैप किए गए I/O एक धार्मिक युद्ध था। और कुछ प्रश्न जो आप अपने प्रश्न को देखने जा रहे हैं वे उन मजबूत विचारों को प्रतिबिंबित करने जा रहे हैं जो आज भी रहने वाले लोगों में हैं। हकीकत यह है कि आज बाजार पर हर चिप में विभिन्न चीजों के लिए कई व्यस्तता है, आप डीडीआर मेमोरी बस से एक एड्रेस डिकोडर के साथ अपनी वास्तविक समय घड़ी को लटका नहीं देते हैं। कुछ अभी भी पूरी तरह से अलग निर्देश और डेटा busses है। एक अर्थ में इंटेल ने चीजों के विभिन्न वर्गों के लिए अलग-अलग पता रिक्त स्थान की अवधारणा के लिए युद्ध जीता, भले ही शब्द I/O बंदरगाह बुरा और बुरा है और 20-30 और वर्षों के लिए कहा जाना चाहिए। आपको मेरी उम्र के लोगों की जरूरत है जो युद्ध से पहले सेवानिवृत्त हो गए या युद्ध से पहले चले गए। यहां तक ​​कि स्मृति मैप किए गए शब्द I/O अतीत की बात है।

वास्तव में है बस इतना ही यह कभी था, इंटेल चिप है कि विशेष निर्देश के उपयोग के द्वारा नियंत्रित किया गया था के बाहर एक ही पते डिकोड बिट। बिट्स का उपयोग करने वाले निर्देशों के एक सेट का उपयोग करने वाले निर्देशों के एक सेट का उपयोग करें। Xmos xcore प्रोसेसर के लिए निर्देश सेट पर कुछ दिलचस्प देखना चाहते हैं, उनके पास मेमोरी मैप किए गए रजिस्टरों की बजाय निर्देश हैं जो बहुत सी चीजें हैं, यह I/O मैप किए गए I/O चीज को एक नए स्तर पर ले जाता है।

यह कहाँ इस्तेमाल किया गया था के रूप में मैं ऊपर वर्णित है, तो आप चीजें हैं जो भावना बनाया है कि या तो डाल और आप वीडियो पिक्सल, नेटवर्क पैकेट स्मृति (शायद), साउंड कार्ड स्मृति की तरह के लिए स्मृति पता स्थान को जलाने के लिए बर्दाश्त कर सकता है (अच्छी तरह से नहीं लेकिन आपके पास हो सकता है), आदि। नियंत्रण रजिस्ट्रार, डेटा के सापेक्ष पता स्थान बहुत छोटा था, शायद कुछ ही रजिस्ट्रार, डीकोड किए गए थे और I/O स्पेस में उपयोग किए गए थे। स्पष्ट लोग/सीरियल बंदरगाह और समांतर बंदरगाह थे, जिनके पास कोई भंडारण नहीं था, यदि आपके पास कुछ भी हो तो सीरियल पोर्ट पर एक छोटा फीफो हो सकता था।

क्योंकि पता स्थान दुर्लभ था यह असामान्य नहीं था और आज भी स्मृति दो रजिस्टरों एक पते रजिस्टर और एक डेटा रजिस्टर के पीछे छिपा हुआ है करने के लिए देखा जाता है, यह स्मृति इन दो रजिस्टर के माध्यम से ही उपलब्ध है, यह स्मृति मैप नहीं है। इसलिए आप पता पुस्तिका में इस छिपी हुई स्मृति में ऑफ़सेट लिखते हैं और आप स्मृति की सामग्री तक पहुंचने के लिए डेटा रजिस्टर को पढ़ते या लिखते हैं। अब क्योंकि इंटेल के पास निर्देश था और आप हार्डवेयर डिकोडर के साथ इंसब/डब्ल्यू आउटब/डब्ल्यू के साथ गठबंधन कर सकते हैं (यदि आपके पास अच्छे/दोस्ताना हार्डवेयर लोग आपके साथ काम कर रहे थे) जब भी आपने I/O चक्र किया था तो पता को स्वत: जोड़ दें। तो आप एड्रेस रजिस्टर में शुरुआती पता लिख ​​सकते हैं और एक रिप आउट आउट कर सकते हैं और प्रोसेसर में मेमोरी घूमने और घड़ी चक्र को डीकोड किए बिना और मेमोरी बस पर आप परिधीय में डेटा को तेज़ी से या बाहर ले जा सकते हैं। इस तरह की चीज को अब आधुनिक सुपर स्केलर प्रोसेसर के लिए डिज़ाइन दोष माना जाता है, जो कि शाखा भविष्यवाणी के आधार पर प्राप्त होता है, आपका हार्डवेयर किसी भी समय पढ़ने का अनुभव कर सकता है जिसके पास कोड निष्पादित करने के लिए कुछ भी नहीं है, नतीजतन आपको कभी भी ऑटो वृद्धि नहीं करनी चाहिए किसी स्थिति में पता या स्पष्ट बिट्स किसी पते को पढ़ने के परिणामस्वरूप कुछ भी पंजीकृत या संशोधित करें।

386 में और वर्तमान में निर्मित सुरक्षा तंत्र वास्तव में उपयोगकर्ता स्थान से I/O तक पहुंचने में बहुत आसान बनाते हैं। एक जीवित रहने के लिए आप क्या करते हैं, आपकी कंपनी क्या उत्पादन करती है, आदि के आधार पर आप निश्चित रूप से उपयोगकर्ता स्थान (विंडोज़ और लिनक्स, आदि अनुप्रयोगों में प्रोग्राम प्रोग्राम) या कर्नेल/ड्राइवर स्थान से निर्देशों के अंदर और बाहर परिवार का उपयोग कर सकते हैं, यह आपका है चुनाव। आप वर्चुअल मशीन का लाभ उठाने और ड्राइवरों से बात करने के लिए I/O निर्देशों का उपयोग करने जैसी मजेदार चीजें भी कर सकते हैं, लेकिन यह संभवतः विंडोज़ और लिनक्स दोनों दुनिया में लोगों को पिस कर देगा, कि ड्राइवर/ऐप इसे बहुत दूर नहीं करेगा। अन्य पोस्टर सही हैं कि जब तक आप ड्राइवर लिख रहे हों, तब तक आपको इन निर्देशों का उपयोग करने की आवश्यकता नहीं होगी, और संभवतः आप कभी भी I/O मैप किए गए I/O का उपयोग करके डिवाइसों के लिए ड्राइवर लिखने की संभावना नहीं रखते हैं क्योंकि आप जानते हैं ... उन विरासत उपकरणों के लिए ड्राइवर पहले से ही लिखे गए हैं। आधुनिक डिजाइनों में सबसे निश्चित रूप से I/O होता है लेकिन यह सभी मेमोरी मैप किया जाता है (प्रोग्रामर परिप्रेक्ष्य से) और स्मृति निर्देशों का उपयोग करता है I/O निर्देश नहीं। अब दूसरी तरफ यदि यह डॉस निश्चित रूप से मृत नहीं है, तो आप इस पर निर्भर करते हैं कि आप कहां मशीनिंग या गैस पंप या नकदी रजिस्टर या डॉस आधारित उपकरणों की एक लंबी सूची बना सकते हैं। असल में यदि आप कहीं भी काम करते हैं जो पीसी या पीसी आधारित परिधीय या मदरबोर्ड बनाता है, तो डीओएस आधारित उपकरण अभी भी परीक्षण और बीआईओएस अपडेट और अन्य समान चीजों को वितरित करने के लिए व्यापक रूप से उपयोग किए जाते हैं। मैं अभी भी परिस्थितियों में भाग लेता हूं जहां मुझे एक लिनक्स ड्राइवर लिखने के लिए वर्तमान डॉस टेस्ट प्रोग्राम से कोड लेना पड़ता है। एनएफएल में फुटबॉल नाटकों को फेंकने या पकड़ने वाले हर किसी की तरह, प्रतिशत के अनुसार बहुत कम सॉफ्टवेयर काम करते हैं जिसमें इस तरह की चीजें शामिल होती हैं। तो यह अभी भी सुरक्षित है कि ये निर्देश आपको इतिहास पाठ से अधिक होने की संभावना नहीं है।

+3

+1, इतिहास सबक के लिए धन्यवाद :) –

+0

लेकिन यदि आप आजकल युवा लोगों को बताते हैं कि वे कभी भी आपको विश्वास नहीं करेंगे ... :-) –

8

कुछ व्यावहारिक उदाहरण दें।

  • एक न्यूनतम बूटलोडर ओएस बना सकते हैं और QEMU और वास्तविक हार्डवेयर पर चला के रूप में मैं यहाँ समझाया है:

    सबसे पहले करने का तरीका जानने https://stackoverflow.com/a/32483545/895245

  • कुछ BIOS कुछ त्वरित और गंदी करने के लिए कॉल करने के आईओ

तब:

  1. PS/2 controller: al करने के लिए कीबोर्ड पर टाइप अंतिम वर्ण के scancode आईडी प्राप्त:

    in $0x60, %al 
    

    Minimal example

  2. Real Time Clock (RTC):

    .equ RTCaddress, 0x70 
    .equ RTCdata, 0x71 
    
    /* al contains seconds. */ 
    mov $0, %al 
    out %al, $RTCaddress 
    in $RTCdata, %al 
    
    /* al contains minutes. */ 
    mov $0x02, %al 
    out %al, $RTCaddress 
    in $RTCdata, %al 
    
    /* al contains hour. */ 
    mov $0x04, %al 
    out %al, $RTCaddress 
    

    Minimal example: सेकंड की परिभाषा के साथ दीवार समय मिलता

  3. Programmable Interval Timer (PIT): जीन दर एक बाधा संख्या 8 हर 0x1234/1193181 सेकंड:

    mov $0b00110100, %al 
    outb %al, $0x43 
    mov $0xFF, %al 
    out %al, $0x34 
    out %al, $0x12 
    

    Minimal example

    एक Linux kernel 4.2 usage। कुछ भी हैं।

पर परीक्षण किया गया: QEMU Ubuntu 14.04, और वास्तविक हार्डवेयर Lenovo ThinkPad T400 2.0.0।

पोर्ट संख्या को खोजने के लिए कैसे: Is there a specification of x86 I/O port assignment?

https://github.com/torvalds/linux/blob/v4.2/arch/x86/kernel/setup.c#L646 कई लिनक्स कर्नेल के द्वारा प्रयोग किया बंदरगाहों की एक सूची है।

अन्य आर्किटेक्चर

नहीं सभी आर्किटेक्चर इस तरह के आईओ समर्पित निर्देश दिया है।

उदाहरण के लिए एआरएम में, आईओ बस जादू हार्डवेयर परिभाषित स्मृति पते पर लिखकर किया जाता है।

मुझे लगता है कि यह https://stackoverflow.com/a/3221839/895245 का मतलब है "स्मृति मैप किए गए I/O बनाम I/O मैप किए गए I/O"।

प्रोग्रामर बिंदु से, मैं एआरएम रास्ता पसंद करता हूं, क्योंकि आईओ निर्देशों को पहले से ही संचालित करने के लिए जादू पते की आवश्यकता होती है, और हमारे पास 64 बिट एड्रेसिंग में बड़ी अप्रयुक्त पता रिक्त स्थान हैं।

एक ठोस एआरएम उदाहरण के लिए https://stackoverflow.com/a/40063032/895245 देखें।

+1

@ डाउनवॉटर, कृपया समझाएं ;-) –

+0

मैंने डाउनवोट नहीं किया, लेकिन, आपका जवाब हालांकि व्यापक है, मैं इसे मूल प्रश्न का उत्तर नहीं देख रहा हूं! –

+0

@CarlSmotricz प्रतिक्रिया के लिए धन्यवाद। "मुझे यह मूल सवाल का जवाब नहीं दिख रहा है!" क्या मैंने ओपी का जवाब नहीं दिया है "x86 में क्या निर्देश हैं और आउट निर्देशों के लिए उपयोग किया गया है? 2) मैंने कभी भी एक स्केनेरियो को एनकआउट नहीं किया जहां मुझे इन निर्देशों का उपयोग करने की आवश्यकता है। मुझे इनकी आवश्यकता कब होगी? 3) कुछ व्यावहारिक उदाहरण दें।" काफी सीधे? –

1

इससे थोड़ा अधिक चाल है। यह केवल 'अतिरिक्त पता बस/चिप चयन पिन' के साथ उसी तार पर 64kb की एक अलग पता स्थान को मल्टीप्लेक्स नहीं करता है। इंटेल 8086 और 8088 और उनके क्लोन भी डेटा बस और पता बस को मल्टीप्लेक्स करते हैं; सीपीयू में सभी बहुत ही असामान्य सामान। डेटाशीट 'न्यूनतम/अधिकतम' कॉन्फ़िगरेशन सामग्री से भरे हुए हैं और सभी लॉच रजिस्टरों को इसे 'सामान्य' व्यवहार करने के लिए इसे अपनाने की आवश्यकता है। दूसरी तरफ, यह पता डिकोडिंग में लोड और गेट्स और 'या' गेट्स को बचाता है और 64 केबी 'हर किसी के लिए पर्याप्त आई/ओ बंदरगाह' होना चाहिए: पी।

इसके अलावा, उन सभी 'ड्राइवर डेवलपर केवल' लोगों के लिए, ध्यान दें: पीसी के मुकाबले अन्य हार्डवेयर में इंटेल संगत चिप्स का उपयोग करने वाले लोगों के अलावा (वे वास्तव में पहले आईबीएम पीसी में उपयोग के लिए कभी इरादा नहीं थे - आईबीएम बस उन्हें ले लिया क्योंकि वे सस्ते थे और पहले से ही बाजार पर थे), इंटेल भी एक ही निर्देश सेट (इंटेल क्वार्क) के साथ माइक्रोकंट्रोलर बेचता है और उसी सप्लायर के साथ अन्य आपूर्तिकर्ताओं द्वारा 'चिप पर सिस्टम' भी बहुत सारे होते हैं। मुझे नहीं लगता कि आप 32kb में अलग 'उपयोगकर्ता स्थान' 'कर्नेल' और 'ड्राइवर' के साथ कुछ भी क्रैक करने का प्रबंधन करेंगे :)। ज्यादातर चीजों के लिए इस तरह के जटिल 'ऑपरेटिंग सिस्टम' न तो इष्टतम हैं और न ही वांछित हैं। रैम में कुछ यूडीपी पैकेट बनाते हैं और फिर उन्हें कुछ रिंग बफर में डालते हैं और कुछ रिले बनाने के लिए क्लिक पर क्लिक करने के लिए 30 एमबी कर्नेल और 10 सेकेंड लोड टाइम की आवश्यकता नहीं होती है, आपको पता है। पीआईसी माइक्रोकंट्रोलर के मामले में यह मूल रूप से सबसे अच्छा विकल्प नहीं है बल्कि आप एक संपूर्ण औद्योगिक पीसी नहीं चाहते हैं। तो बंदरगाह I/O निर्देशों का उपयोग बड़े ऑपरेटिंग सिस्टम के लिए 'ड्राइवर डेवलपर्स' द्वारा किया जाता है।

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