2008-10-20 10 views
13

पर संरक्षित मोड कीबोर्ड एक्सेस मैं एक बहुत ही बुनियादी कर्नेल के लिए कीबोर्ड इनपुट पर काम कर रहा हूं जिसे मैं विकसित कर रहा हूं और मैं पूरी तरह से अटक गया हूं। मुझे ऑनलाइन कोई जानकारी नहीं मिल रही है जो मुझे वह जानकारी दिखा सकती है जिसे मुझे जानना है।x86 असेंबली

मेरा कर्नेल अभी सुरक्षित मोड में चल रहा है, इसलिए मैं वास्तविक मोड कीबोर्ड और दिन में कूदने के बिना वास्तविक मोड कीबोर्ड दिनचर्या का उपयोग नहीं कर सकता, जिसे मैं टालने की कोशिश कर रहा हूं। मैं संरक्षित मोड से अपने कीबोर्ड तक पहुंचने में सक्षम होना चाहता हूं। क्या किसी को भी यह करना आता है? अब तक की एकमात्र चीज यह है कि इसमें नियंत्रक से सीधे अंदर/बाहर बंदरगाहों का उपयोग करना शामिल है, लेकिन उससे परे मैं स्टंप हो गया हूं। यह निश्चित रूप से ऐसा कुछ नहीं है जो अक्सर आता है। आम तौर पर, असेंबली ट्यूटोरियल मानते हैं कि आप नीचे एक ऑपरेटिंग सिस्टम चला रहे हैं।

मैं x86 असेंबली के लिए बहुत नया हूं, इसलिए मैं संरक्षित मोड से मानक हार्डवेयर के साथ काम करने के लिए कुछ अच्छे संसाधनों की तलाश में हूं। मैं एनएसएम के साथ असेंबली स्रोत कोड संकलित कर रहा हूं और इसे डीजेपीपीपी के साथ संकलित सी स्रोत कोड से जोड़ रहा हूं। कोई सुझाव?

+0

हाय, मुझे पता है कि यह एक पुराना सवाल है, लेकिन क्या आप समाधान के साथ अपना प्रश्न संपादित कर सकते हैं, या मेरे प्रश्न पर एक नज़र डालें http://stackoverflow.com/questions/22744624/keyboard-interrupt-handler-for- स्वयं-कर्नेल-सी? धन्यवाद –

उत्तर

12

MIT operating systems class में बहुत अच्छे संदर्भ हैं। विशेष रूप से, कीबोर्ड और माउस प्रोग्रामिंग पर Adam Chapweske's resources देखें।

संक्षेप में, हाँ, आप कच्चे इन/आउट बंदरगाहों का उपयोग करेंगे, जिसके लिए या तो कर्नेल मोड में चलने की आवश्यकता है, या IF OG अनुमति रजिस्टर में I/O अनुमति बिट्स (IOPL) सेट है। I/O अनुमतियों के बारे में अधिक जानकारी के लिए this page देखें।

+1

हाँ !!!मुझे उन पृष्ठों के लिए धन्यवाद करने के लिए मिल गया। आप आश्चर्यजनक हैं, और यदि मैं कर सकता तो मैं आपको 10 बार वोट दूंगा। अब मुझे केवल स्कैन कोड को ASCII में कनवर्ट करने की आवश्यकता है, लेकिन मैं शायद ऐसा कर सकता हूं, (और इसके अलावा, इसे स्क्रीन पर स्कैनकोड आउटपुट करने से वास्तव में साफ दिखता है!) धन्यवाद एक गुच्छा! –

+1

बेहद उपयोगी! –

+0

एमआईटी लिंक मृत, संभावित रूप से अपडेट किया गया: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/ –

3

आप मानक विरासत हार्डवेयर के साथ वास्तविक और संरक्षित मोड पर उसी तरह काम करते हैं। इस मामले में, आप 8042 के साथ I/O बंदरगाहों 0x60 से 0x6f पर बात करना चाहते हैं, जो बदले में तार के दूसरे छोर पर कीबोर्ड के भीतर नियंत्रक से बात करेगा।

एक त्वरित Google खोज ने मुझे http://heim.ifi.uio.no/~stanisls/helppc/8042.html (8042 के लिए) और http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (कीबोर्ड के लिए) पर एक दिलचस्प संसाधन पाया।

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

+0

यह अच्छी जानकारी है हालांकि, मैंने पाया कि मुझे पोर्ट्स 0x60 और ox64, 0x6F नहीं, के साथ बात करने की आवश्यकता है। सभी दस्तावेज इस तरह से इंगित करते हैं। शायद एक टाइपो? –

+0

यह बंदरगाह 0x60 _to_ 0x6f है (किसी भी x86 लिनक्स मशीन पर/proc/ioports देखें)। इनमें से, 0x60 और 0x64 वास्तव में उपयोग किया जाता है। – CesarB

+0

लिंक मृत हैं, लेकिन वेबैक मशीन में उन्हें है: https://web.archive.org/web/20150503041658/http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html –

0

8042 पीएस/2 नियंत्रक सबसे आसान संभावना की तरह दिखता है।

sudo apt-get install build-essential qemu 
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu 
git clone git://git.code.sf.net/p/oszur11/code oszur11 
cd oszur11/Chapter_06_Shell/04_Makepp 
make qemu 

Ubuntu 14.04 AMD64 पर परीक्षण किया गया:

oszur11 ओएस ट्यूटोरियल https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

बस के नीचे एक काम उदाहरण में शामिल है।

मेरे GitHub दर्पण (अपस्ट्रीम निष्क्रिय): https://github.com/cirosantilli/oszur11-operating-system-examples

इसे यहाँ नहीं प्रजनन क्योंकि कोड यह बहुत लंबा है, अगर मैं एक न्यूनतम उदाहरण में कुंजीपटल भाग को अलग करने के लिए प्रबंधन अद्यतन करेगा।

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