कीबोर्ड इनपुट और टेक्स्ट आउटपुट कैसे काम करते हैं?


85

मान लीजिए मैं Aएक पाठ संपादक में कुंजी दबाता हूं और यह aदस्तावेज़ में चरित्र सम्मिलित करता है और इसे स्क्रीन पर प्रदर्शित करता है। मुझे पता है कि संपादक एप्लिकेशन सीधे हार्डवेयर के साथ संचार नहीं कर रहा है (बीच में एक कर्नेल और सामान है), इसलिए मेरे कंप्यूटर के अंदर क्या चल रहा है?

जवाबों:


100

कई अलग-अलग परिदृश्य हैं; मैं सबसे आम लोगों का वर्णन करूँगा। क्रमिक मैक्रोस्कोपिक घटनाएँ हैं:

  1. इनपुट: कुंजी प्रेस ईवेंट को कीबोर्ड हार्डवेयर से एप्लिकेशन में प्रेषित किया जाता है।
  2. प्रसंस्करण: आवेदन यह तय करता है कि क्योंकि कुंजी Aको दबाया गया था, उसे चरित्र प्रदर्शित करना होगा a
  3. आउटपुट: एप्लिकेशन aस्क्रीन पर प्रदर्शित करने का आदेश देता है ।

जीयूआई अनुप्रयोगों

यूनिक्स सिस्टम का वास्तविक मानक ग्राफिकल यूजर इंटरफेस एक्स विंडो सिस्टम है , जिसे अक्सर एक्स 11 कहा जाता है क्योंकि यह अनुप्रयोगों और डिस्प्ले सर्वर के बीच अपने कोर प्रोटोकॉल के 11 वें संस्करण में स्थिर होता है। एक्स सर्वर नामक एक प्रोग्राम ऑपरेटिंग सिस्टम कर्नेल और अनुप्रयोगों के बीच बैठता है; यह स्क्रीन पर खिड़कियां प्रदर्शित करने और फोकस करने वाली खिड़की पर प्रमुख प्रेस को प्रसारित करने सहित सेवाएं प्रदान करता है।

इनपुट

+----------+              +-------------+         +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+              +-------------+         +-----+
             USB, PS/2, …                 PCI, …
             key down/up

सबसे पहले, कुंजी प्रेस और कुंजी रिलीज के बारे में जानकारी कीबोर्ड से कंप्यूटर और कंप्यूटर के अंदर प्रसारित की जाती है। विवरण हार्डवेयर के प्रकार पर निर्भर करता है। मैं इस हिस्से पर अधिक ध्यान केन्द्रित नहीं करूंगा क्योंकि यह जानकारी श्रृंखला के इस हिस्से में समान रहती है: एक निश्चित कुंजी को दबाया गया या जारी किया गया।

         +--------+        +----------+          +-------------+
-------->| kernel |------->| X server |--------->| application |
         +--------+        +----------+          +-------------+
interrupt          scancode             keysym
                   =keycode            +modifiers

जब कोई हार्डवेयर ईवेंट होता है, तो सीपीयू एक बाधा उत्पन्न करता है , जो कर्नेल में कुछ कोड को निष्पादित करने का कारण बनता है । यह कोड बताता है कि हार्डवेयर ईवेंट कीबोर्ड से आने वाली एक महत्वपूर्ण प्रेस या कुंजी है और स्कैन कोड को रिकॉर्ड करता है जो कुंजी की पहचान करता है।

एक्स सर्वर एक फ़ाइल के माध्यम से इनपुट घटनाओं को पढ़ता है , उदाहरण के लिए /dev/input/eventNNNलिनक्स पर (जहां एनएनएन एक संख्या है)। जब भी कोई घटना होती है, तो कर्नेल संकेत देता है कि उस उपकरण से पढ़ने के लिए डेटा है। उपकरण फ़ाइल कुंजी ऊपर / नीचे एक स्कैन कोड है, जो या हार्डवेयर द्वारा प्रेषित मूल्य के समान नहीं हो सकता के साथ घटनाओं पहुंचाता (कर्नेल एक आम मूल्य के लिए एक कुंजीपटल पर निर्भर मूल्य से कोड स्कैन का अनुवाद कर सकते हैं, और लिनक्स नहीं करता है 'स्कैन कोड्स को नहीं जानता है जो इसे नहीं जानते हैं )।

X स्कैन कोड को कॉल करता है जिसे वह एक कीकोड पढ़ता है । एक्स सर्वर एक मेज का रख-रखाव करता है जो कुंजी कोड को कुंजीशब्दों ("कुंजी प्रतीक" के लिए संक्षिप्त) में अनुवाद करता है। जबकि keysyms जैसे नाम हैं keycodes, आंकिक हैं A, aacute, F1, KP_Add, Control_L, ... keysym पर निर्भर करते हुए संशोधक कुंजियों दबाया जाता है (अलग हो सकता है Shift, Ctrl, ...)।

कुंजीकोड से कीपिंग से मानचित्रण को कॉन्फ़िगर करने के लिए दो तंत्र हैं:

  • xmodmap पारंपरिक तंत्र है। यह एक साधारण टेबल मैपिंग कीकोड है जो की-जिम (अनमॉडिफाइड, शिफ्टेड,…) की सूची में है।
  • XKB एक अधिक शक्तिशाली, लेकिन अधिक संशोधक के लिए बेहतर समर्थन के साथ अधिक जटिल तंत्र है, विशेष रूप से दूसरों के बीच दोहरी भाषा विन्यास के लिए।

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

एक सामान्य कॉन्फ़िगरेशन में, जब आप Aबिना किसी संशोधक के साथ लेबल की गई कुंजी दबाते हैं , तो यह aएप्लिकेशन को की- वर्ड भेजता है ; यदि एप्लिकेशन उस मोड में है जहां आप टेक्स्ट टाइप कर रहे हैं, तो यह कैरेक्टर को सम्मिलित करता है a

कीबोर्ड लेआउट और xmodmap का संबंध कीबोर्ड इनपुट पर अधिक विस्तार से जाता है। लिनक्स में माउस घटनाएँ कैसे काम करती हैं? निचले स्तर पर माउस इनपुट का अवलोकन देता है।

उत्पादन

+-------------+        +----------+          +-----+         +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+        +----------+          +-----+         +---------+
               text or              varies          VGA, DVI,
               image                                HDMI, …

चरित्र प्रदर्शित करने के दो तरीके हैं।

देखें कि विभिन्न प्रकार के XWindows फोंट के उद्देश्य क्या हैं? X11 के तहत क्लाइंट-साइड और सर्वर-साइड टेक्स्ट रेंडरिंग की चर्चा के लिए।

एक्स सर्वर और ग्राफिक्स प्रोसेसिंग यूनिट (वीडियो कार्ड पर प्रोसेसर) के बीच क्या होता है, बहुत हार्डवेयर पर निर्भर है। सरल सिस्टम में मेमोरी सर्वर क्षेत्र में एक्स सर्वर ड्रॉ होता है जिसे फ्रेमबफ़र कहा जाता है , जिसे जीपीयू डिस्प्ले के लिए चुनता है। किसी भी 21 वीं सदी के पीसी या स्मार्टफोन पर पाए जाने वाले उन्नत सिस्टम GPU को बेहतर प्रदर्शन के लिए सीधे कुछ ऑपरेशन करने की अनुमति देते हैं। अंततः, GPU स्क्रीन के पिक्सेल को सेकंड के हर अंश को मॉनिटर द्वारा पिक्सेल तक पहुँचाता है।

पाठ मोड अनुप्रयोग, एक टर्मिनल में चल रहा है

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

इनपुट

      +-------------------+               +-------------+
----->| terminal emulator |-------------->| application |
      +-------------------+               +-------------+
keysym                     character or
                           escape sequence

टर्मिनल एमुलेटर " डाउन होने के Leftदौरान दबाया गया " जैसी घटनाओं को प्राप्त करता है Shift। टर्मिनल एमुलेटर और टेक्स्ट मोड एप्लिकेशन के बीच का इंटरफ़ेस एक छद्म टर्मिनल (pty) है , जो एक कैरेक्टर डिवाइस है जो बाइट्स को प्रसारित करता है। जब टर्मिनल एमुलेटर एक महत्वपूर्ण प्रेस घटना प्राप्त करता है, तो यह इसे एक या एक से अधिक बाइट्स में बदल देता है, जो एप्लिकेशन को पीटीआई डिवाइस से पढ़ने के लिए मिलता है।

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

मुख्य प्रेस जो एक फंक्शन की के अनुरूप होते हैं Ctrlया संशोधक जैसे प्रिंट करने योग्य चरित्र जैसे Altकि एक एस्केप सीक्वेंस के रूप में भेजे जाते हैं । एस्केप सीक्वेंस में आमतौर पर कैरेक्टर एस्केप (बाइट वैल्यू 27 = 0x1B = \033, कभी-कभी एक या अधिक प्रिंट करने योग्य कैरेक्टर के रूप में ^[या \eउसके बाद) को दर्शाया जाता है । कुछ कुंजियों या कुंजी संयोजन में ASCII- आधारित एन्कोडिंग्स में उनके अनुरूप नियंत्रण वर्ण होता है (जो कि यूनिकोड सहित आज के उपयोग में उन सभी में बहुत सुंदर है): Ctrl+ letterश्रेणी 1-26 में एक वर्ण मान प्राप्त करता Escहै, भागने का वर्ण है ऊपर देखा और यह भी रूप में ही है Ctrl+ [, Tabके रूप में ही है Ctrl+ I,ReturnCtrl+ Mआदि के समान है ।

अलग-अलग टर्मिनल किसी दिए गए कुंजी या कुंजी संयोजन के लिए अलग-अलग एस्केप अनुक्रम भेजते हैं। सौभाग्य से, अनुलोम विलोम सत्य नहीं है: एक अनुक्रम दिया गया है, अधिकांश एक प्रमुख संयोजन में अभ्यास है जो इसे एन्कोड करता है। एक अपवाद चरित्र 127 = 0x7f = है \0177जो अक्सर Backspaceलेकिन कभी-कभी होता है Delete

एक टर्मिनल में, यदि आप एक कुंजी संयोजन के बाद Ctrl+ टाइप करते हैं, तो Vयह कुंजी संयोजन से भागने के क्रम के पहले बाइट को शाब्दिक रूप से सम्मिलित करता है। चूंकि एस्केप सीक्वेंस में आम तौर पर पहले अक्षर के बाद केवल प्रिंट करने योग्य अक्षर होते हैं, इसलिए यह संपूर्ण एस्केप अनुक्रम को शाब्दिक रूप से सम्मिलित करता है। मुख्य बाइंडिंग टेबल देखें ? इस संदर्भ में zsh की चर्चा के लिए।

टर्मिनल कुछ संशोधक संयोजन के लिए एक ही एस्केप अनुक्रम प्रेषित कर सकते हैं (उदाहरण के लिए कई टर्मिनलों दोनों के लिए एक अंतरिक्ष चरित्र संचारित Spaceऔर Shift+ Space; टर्म संशोधक संयोजन भेद करने के लिए एक विधा है , लेकिन लोकप्रिय वी T ई पुस्तकालय के आधार पर टर्मिनलों नहीं है )। कुछ कुंजियाँ बिल्कुल भी प्रेषित नहीं की जाती हैं, उदाहरण के लिए संशोधक कुंजियाँ या कुंजियाँ जो टर्मिनल एमुलेटर के बंधन को ट्रिगर करती हैं (उदाहरण के लिए कॉपी या पेस्ट)।

यदि यह इच्छा है तो प्रतीकात्मक प्रमुख नामों में से बच अनुक्रमों का अनुवाद करना आवेदन पर निर्भर है।

उत्पादन

+-------------+               +-------------------+
| application |-------------->| terminal emulator |--->
+-------------+               +-------------------+
               character or
               escape sequence

आउटपुट इनपुट के बजाय सरल है। यदि अनुप्रयोग किसी वर्ण को pty डिवाइस फ़ाइल में आउटपुट करता है, तो टर्मिनल एमुलेटर इसे वर्तमान कर्सर स्थिति में प्रदर्शित करता है। (टर्मिनल एमुलेटर एक कर्सर स्थिति रखता है, और स्क्रॉल करता है यदि कर्सर स्क्रीन के निचले हिस्से के नीचे होगा।) अनुप्रयोग कर्सर को स्थानांतरित करने के लिए टर्मिनल को बताए जाने के लिए आउटपुट एस्केप सीक्वेंस (ज्यादातर शुरुआत ^[या इसके साथ ^]) भी कर सकता है। पाठ विशेषताओं को बदलना (रंग, बोल्ड,…), या स्क्रीन का हिस्सा मिटा देना।

एस्केप टर्मिनल एमुलेटर द्वारा समर्थित दृश्यों में वर्णित हैं termcap या terminfo डेटाबेस। अधिकांश टर्मिनल एमुलेटर आजकल एक्सटर्म के साथ काफी निकटता से जुड़े हुए हैं । LESS_TERMCAP_ * चर पर प्रलेखन देखें ? टर्मिनल क्षमता की जानकारी डेटाबेस की लंबी चर्चा के लिए, और कर्सर को पलक झपकने से कैसे रोका जाए और क्या मैं अपने स्थानीय मशीन के टर्मिनल रंगों को उन मशीन का उपयोग करने के लिए सेट कर सकता हूँ जिन्हें मैं मशीन में ssh करता हूँ? कुछ उपयोग उदाहरणों के लिए।

एक पाठ कंसोल में चल रहा अनुप्रयोग

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

रिमोट अनुप्रयोग, नेटवर्क पर पहुँचा

दूरस्थ पाठ अनुप्रयोग

यदि आप किसी दूरस्थ मशीन पर प्रोग्राम चलाते हैं, जैसे SSH पर , तो नेटवर्क संचार प्रोटोकॉल पीटीआई स्तर पर डेटा रिले करता है।

+-------------+           +------+           +-----+           +----------+
| application |<--------->| sshd |<--------->| ssh |<--------->| terminal |
+-------------+           +------+           +-----+           +----------+
               byte stream        byte stream       byte stream
               (char/seq)         over TCP/…        (char/seq)

यह ज्यादातर पारदर्शी है, सिवाय इसके कि कभी-कभी रिमोट टर्मिनल डेटाबेस स्थानीय टर्मिनल की सभी क्षमताओं को नहीं जानता होगा।

दूरस्थ X11 अनुप्रयोग

अनुप्रयोगों के बीच संचार प्रोटोकॉल एक सर्वर ही एक बाइट स्ट्रीम है जिसे एसएसएच जैसे नेटवर्क प्रोटोकॉल पर भेजा जा सकता है।

+-------------+            +------+        +-----+            +----------+
| application |<---------->| sshd |<------>| ssh |<---------->| X server |
+-------------+            +------+        +-----+            +----------+
               X11 protocol        X11 over       X11 protocol
                                   TCP/…

यह ज्यादातर पारदर्शी है, सिवाय इसके कि कुछ एक्सेलेरेशन फीचर्स जैसे मूवी डिकोडिंग और 3 डी रेंडरिंग जिसमें एप्लिकेशन और डिस्प्ले के बीच सीधे संचार की आवश्यकता होती है।


पूरी तरह से निश्चित नहीं है, लेकिन चूंकि उत्तर आम तौर पर विस्तृत है, मुझे आश्चर्य होता है कि क्या भाग जो कहता है "एक पाठ कंसोल में चल रहा अनुप्रयोग" हो सकता है कि इसमें man 5 keymapsअनुवाद करने के keycodesलिए उपयोग की जाने वाली चीजों की तरह न हो scancodes। हालांकि जैसा कि मुख्य रूप से कहा गया है कि यह अभी तक उपकरण / कार्यक्रमों का एक अलग सेट है और यह शायद कुछ और अंतर्दृष्टि का गुणन करेगा। इसके बाद का उत्तर एम्बेडेड संबंधित प्रश्नों के कारण +1 और महान है।
मानवतावादी

मैंने पाया PgUpऔर Ctrl+PgUptty1 में अप्रभेद्य हैं (TERM = linux)। क्या कीसम -> नियंत्रण अनुक्रम मानचित्रण को कॉन्फ़िगर किया जा सकता है?
stewbasic

@stewbasic हाँ, एक कीमैप द्वारा लोड किए जाने के साथ loadkeys। टैग किए गए प्रश्नों के लिए खोज करें कंसोल कंसोल -लेआउट
गिल्स

@ गिल्स थैंक्स! यह ध्यान देने योग्य है कि लोडकीप्स दोनों मैपिंग कीकोड को बदल देता है -> कीसम और कीसम -> एस्केप सीक्वेंस (यह शुरू में मेरे लिए स्पष्ट नहीं था)।
स्टूअबेसिक

1
वाह, यह सबसे अच्छा जवाबों में से एक है जो मैंने कभी स्टैटेक्सचेंज पर देखा है - अच्छी तरह से संगठित, सवाल का जवाब देता है, प्रासंगिक संदर्भ, अन्य उपयोगी उत्तर प्रदान करता है, और यहां तक ​​कि अच्छा ASCII कला भी है!
जॉनट्रॉन

4

यदि आप इसे यूनिक्स प्रणाली में देखना चाहते हैं जो कि समझने में छोटा है, तो Xv6 में खुदाई करें । यह कमोबेश पौराणिक यूनिक्स 6 वें संस्करण है, जो जॉन लॉयन की प्रसिद्ध टिप्पणी का आधार बन गया, जिसे लंबे समय तक सीज़डैट के रूप में प्रसारित किया गया। एएनएसआई सी के तहत संकलन करने और मल्टीप्रोसेसर जैसे आधुनिक विकास को ध्यान में रखते हुए इसका कोड फिर से तैयार किया गया।

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