2011-01-04 26 views
17

मैं एक किशोर हूं जो असेंबली भाषा में बहुत रुचि रखता है। मैं इंटेल x86 असेंबलर में एक छोटा ऑपरेटिंग सिस्टम लिखने की कोशिश कर रहा हूं, और मैं सोच रहा था कि स्क्रीन पर सीधे कैसे लिखना है, जैसा कि BIOS या किसी अन्य ऑपरेटिंग sytems पर भरोसा किए बिना। मैं कोरबूट, लिनक्स और कोलिब्री के स्रोतों को देख रहा था, दूसरों के बीच, कोड के कुछ टुकड़े खोजने और समझने की उम्मीद में। मैं अभी तक इस संबंध में सफल नहीं हुआ हूं, हालांकि मुझे विश्वास है कि मैं लिनक्स स्रोत कोड पर एक और नजर डालेगा, यह उन स्रोतों के बारे में सबसे ज्यादा समझदार है जो मैंने खोजा है।मैं सीधे स्क्रीन पर कैसे लिख सकता हूं?

अगर कोई इसे जानता है, या जानता है कि स्रोत कोड के कुछ हिस्सों में जहां मैं देख सकता हूं, तो अगर उन्होंने मुझे बताया तो मैं इसकी सराहना करता हूं।

या बेहतर अभी तक, अगर कोई जानता है कि इंटेल x86 सीपीयू पर I/O पोर्ट किस हार्डवेयर को जोड़ता है, तो यह भी सराहना की जाएगी कि इसकी भी सराहना की जाएगी। मुझे यह पूछने की आवश्यकता है कि इंटेल 64 और आईए -32 आर्किटेक्चर सॉफ्टवेयर डेवलपर के मैनुअल वॉल्यूम 1: मूल आर्किटेक्चर में इनपुट/आउटपुट के अध्याय में, न ही वॉल्यूम 3 में आईएन या आउट निर्देश के लिए अनुभागों में, क्या मुझे इनमें से कोई भी जानकारी मिल सकती है। और क्योंकि मेरे पास स्रोतों में प्रासंगिक निर्देशों की खोज करना बहुत कठिन रहा है।

+0

वाह, महान प्रतिक्रियाओं के लिए धन्यवाद, हर कोई। प्रदान किए गए सभी उत्तरों इस तरह दिखते हैं कि वे सहायक होने की संभावना है। – user336462

+3

क्या आपने शार्पी माना है? वे अधिकांश सीआरटी और एलईडी डिस्प्ले में आसानी से ग्लाइड करते हैं। –

उत्तर

1

मेरे दायरे से थोड़ा थोड़ा लेकिन आप VESA में देखना चाहते हैं।

+0

धन्यवाद, यह जगह दिखती है कि यह उन स्थानों की तुलना में अधिक सहायक हो सकती है जो मैं देख रहा हूं। – user336462

+0

@ user336462 कोई समस्या नहीं। हमें बताएं कि यह कैसे काम करता है और आप किसके साथ आगे बढ़ते हैं। –

+0

मुझे यकीन नहीं है कि यह क्यों मतदान किया गया था, लेकिन क्यों एक संदेश छोड़ना अच्छा लगेगा। –

1

यह इतना आसान नहीं है। जबकि BIOS स्क्रीन पर टेक्स्ट लिखने के लिए INT 10h प्रदान करता है, ग्राफिक्स एक एडाप्टर से अगले तक भिन्न होता है। उदाहरण के लिए, आप यहां वीजीए http://www.wagemakers.be/english/doc/vga के लिए जानकारी पा सकते हैं। कुछ प्राचीन एसवीजीए एडेप्टर http://www.intel-assembler.it/portale/5/assembly-game-programming-encyclopedia/assembly-game-programming-encyclopedia.asp यहां।

1

सामान्य I/O बंदरगाहों के लिए, आपको BIOS के माध्यम से जाना होगा, जिसका अर्थ है इंटरप्ट्स। कई ब्लू चंद्रमा पहले, मैंने कुछ वास्तविक-मोड असेंबली लिखने में मदद के लिए Don Stoner से संदर्भों का उपयोग किया था, लेकिन कुछ महीनों के बाद मैंने इसे जला दिया और मुझे जो कुछ पता था उसे भूल गया।

16

भाग 1

वर्ष वीजीए मोड के लिए, वहाँ (विरासत) प्रदर्शन स्मृति क्षेत्र में लिखने के लिए एक निश्चित पते है। टेक्स्ट मोड के लिए यह क्षेत्र 0x000B8000 से शुरू होता है। ग्राफिक्स मोड के लिए यह 0x000A0000 से शुरू होता है।

उच्च-रिज़ॉल्यूशन वीडियो मोड (जैसे वीईएसए/वीबीई इंटरफ़ेस द्वारा सेट किए गए) के लिए यह काम नहीं करता है क्योंकि विरासत डिस्प्ले मेमोरी एरिया का आकार 64 कीबी तक सीमित है और अधिकांश उच्च-रिज़ॉल्यूशन वीडियो मोड की आवश्यकता है अंतरिक्ष (जैसे 1024 * 768 * 32-बीपीपी = 2.25 एमआईबी)। चारों ओर घूमने के लिए वीबीई द्वारा समर्थित 2 अलग-अलग विधियां हैं।

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

दूसरी विधि को "रैखिक फ्रेमबफर" (या सिर्फ "एलएफबी") कहा जाता है, जहां वीडियो कार्ड के पूरे डिस्प्ले मेमोरी एरिया को किसी भी गन्दा बैंक स्विचिंग के बिना एक्सेस किया जा सकता है। आपको वीईएसए/वीबीई इंटरफ़ेस से पूछना है जहां यह क्षेत्र है (और यह आमतौर पर 0xC0000000 और 0xFFF00000 के बीच "पीसीआई छेद" में है)। इसका मतलब है कि आप इसे वास्तविक मोड में नहीं एक्सेस कर सकते हैं, और संरक्षित मोड या लंबे मोड या "अवास्तविक मोड" का उपयोग करने की आवश्यकता है।

जब आप एलएफबी मोड का उपयोग कर रहे हों तो पिक्सेल का पता ढूंढने के लिए, आप "pixel_address = display_memory_address + y * bytes_per_line + x * bytes_per_pixel" जैसे कुछ करेंगे। "बाइट्स_पर_लाइन" वीईएसए/वीबीई इंटरफ़ेस से आता है (और हो सकता है कि "क्षैतिज_रेसोल्यूशन * बाइट्स_पर_लाइन" जैसा न हो क्योंकि क्षैतिज रेखाओं के बीच पैडिंग हो सकती है)।

pixel_offset = y * bytes_per_line + x * bytes_per_pixel; 
bank_number = pixel_offset/bank_size; 
pixel_starting_address_within_bank = pixel_offset % bank_size; 

कुछ पुराने वीजीए मोड के लिए (उदाहरण के लिए 256 रंग "मोड 0x13") यह बहुत LFB के समान है, सिवाय इसके कि:

के लिए "बैंक बंद" VBE/VESA मोड, यह कुछ अधिक की तरह हो जाता है लाइनों के बीच कोई पैडिंग नहीं है और आप "pixel_address = display_memory_address + (y * horizontal_resolution + x) * bytes_per_pixel" कर सकते हैं। टेक्स्ट मोड के लिए यह मूल रूप से वही बात है, सिवाय इसके कि 2 बाइट प्रत्येक चरित्र और इसकी विशेषता निर्धारित करते हैं - उदा। "char_address = display_memory_address + (y * horizontal_resolution + x) * 2"। अन्य पुराने वीजीए मोड (मोनोक्रोम/2-रंग, 4-रंग और 16-रंग मोड) के लिए वीडियो कार्ड की मेमोरी पूरी तरह से व्यवस्थित होती है। यह "विमान" में विभाजित है जहां प्रत्येक विमान में पिक्सेल का एक बिट होता है, और (उदाहरण के लिए) 16-रंग मोड में एक पिक्सेल को अपडेट करने के लिए आपको 4 अलग-अलग विमानों को लिखना होगा। प्रदर्शन कारणों से वीजीए हार्डवेयर विभिन्न लेखन मोड और विभिन्न पठन मोड का समर्थन करता है, और यह जटिल हो सकता है (यहां पर्याप्त रूप से वर्णन करने के लिए बहुत जटिल)।

भाग 2

मैं/हे बंदरगाहों के लिए (80x86 पर, "पीसी compatibles"), वहाँ 3 सामान्य श्रेणियों। पहला "वास्तविक तथ्य" विरासत डिवाइस है जो निश्चित I/O बंदरगाहों का उपयोग करता है। इसमें पीआईसी चिप्स, आईएसए डीएमए कंट्रोलर, पीएस/2 कंट्रोलर, पीआईटी चिप, सीरियल/समांतर बंदरगाह इत्यादि जैसी चीजें शामिल हैं। लगभग हर कुछ जो इन उपकरणों में से प्रत्येक प्रोग्राम को प्रोग्राम करने का वर्णन करता है, आपको बताएगा कि डिवाइस कौन से I/O बंदरगाहों का उपयोग करता है।

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

तीसरी श्रेणी "प्लग & प्ले" है, जहां डिवाइस को पूछने के कुछ तरीके हैं I/O बंदरगाहों का उपयोग करता है (और ज्यादातर मामलों में, डिवाइस का उपयोग करने वाले I/O बंदरगाहों को बदलना)। इसका एक उदाहरण पीसीआई है, जहां एक "पीसीआई कॉन्फ़िगरेशन स्पेस" है जो आपको प्रत्येक पीसीआई डिवाइस के बारे में बहुत सारी जानकारी बताता है। इस श्रेणियों के लिए, कोई भी तरीका यह निर्धारित नहीं कर सकता कि कौन से डिवाइस रनिंग समय पर किए बिना I/O बंदरगाहों का उपयोग कर रहे हैं, और कुछ BIOS सेटिंग्स को बदलने से इन सभी उपकरणों को I/O बंदरगाहों को बदलना पड़ सकता है।

यह भी ध्यान दें कि एक इंटेल सीपीयू केवल एक सीपीयू है। कुछ भी उन CPUs को किसी ऐसे पीसी में उपयोग करने से रोकता है जो "पीसी संगत" कंप्यूटर से मूल रूप से भिन्न होता है। इंटेल के सीपीयू मैनुअल आपको हार्डवेयर के बारे में कुछ भी नहीं बताएंगे जो सीपीयू के बाहर मौजूद है (चिपसेट या डिवाइस सहित)।

भाग 3

(कि ओएस डेवलपर्स/शौक रखने वालों के लिए लक्षित है) http://osdev.org/ (उनके विकि और उनके मंचों) है अधिक जानकारी के लिए जाने के लिए शायद सबसे अच्छी जगह। http://www.osdever.net/FreeVGA/home.htm यह कुछ विवरण कोड है कि स्क्रीन के लिए सीधे लिखते हैं लिखने के लिए महत्वपूर्ण बारे में बात करती:

+3

मैं तब तक जोड़ूंगा जब तक कि आपके ओएस के लिए एक जीयूआई बिल्डिंग बीआईओएस के साथ न जाए, यह समय बचाएगा कि आप कार्य-स्विचिंग और मेमोरी मैनेजमेंट जैसी चीजों को "घुसपैठ" करने में व्यतीत कर सकते हैं। अनुलेख मुझे लगता है कि हर किशोरी प्रोग्रामर को ओएस लिखना चाहिए;) भले ही यह सिर्फ बूट लोडर हो। आप इतना सीखते हैं –

0

मैं एक जगह है कि इस मामले पर कुछ अच्छी जानकारी प्रदान करता है पाया। मैंने इसे डॉन स्टोनर की साइट के लिंक से पाया (लिंक के लिए धन्यवाद, सिल्वरबैकनेट!)। मैं अभी भी और अधिक जानकारी की तलाश में हूं, इसलिए यदि किसी के पास कोई और विचार है, तो मैं बहुत मदद की सराहना करता हूं।

0

मैं एक किताब है कि मेरे सवालों का जवाब करने लगता है पाया। मुझे एहसास हुआ कि फ्रीवीजीए पेज पर इसके बारे में पढ़ने के बाद ऐसी किताब मौजूद हो सकती है। यहां लिंक है: Programmer's Guide to the EGA, VGA and Super VGA cards

1

सीधे स्क्रीन पर लिखने के लिए, आपको शायद वीजीए टेक्स्ट मोड क्षेत्र में लिखना चाहिए। यह स्मृति का एक ब्लॉक है जो पाठ मोड के लिए एक बफर है।

पाठ मोड स्क्रीन 80x25 वर्ण के होते हैं; प्रत्येक चरित्र 16 बिट चौड़ा है। यदि पहला बिट सेट किया गया है तो चरित्र स्क्रीन पर झपकी देगा। अगले 3 बिट्स फिर पृष्ठभूमि रंग का विवरण देते हैं; पहले बाइट के अंतिम 4 बिट अग्रभूमि (या पाठ चरित्र) के रंग हैं। अगले 8 बिट चरित्र के मूल्य हैं। यह आमतौर पर कोड-पेज 737 या 437 होता है, लेकिन यह सिस्टम से सिस्टम में भिन्न हो सकता है।

Here इस बफर का ब्यौरा एक विकिपीडिया पृष्ठ है, और here कोड पृष्ठ पर 437

के लिए एक लिंक पाठ मोड में BIOS आम तौर पर आप सेट है, लेकिन अगर नहीं तो आप इसे अपने आप को सेट करना होगा int10h साथ (मोड 0x03)

+0

ब्लिंक बिट सभी हार्डवेयर/अनुकरणकर्ताओं पर लागू नहीं होता है। कुछ हार्डवेयर/अनुकरणक झपकी देंगे जबकि अन्य इसे एक तीव्रता बिट (1 = उच्च तीव्रता, 0 = कम तीव्रता) मानते हैं। जब आप पहली बार कहते हैं तो आप वास्तव में सबसे महत्वपूर्ण बिट (एमएसबी) का जिक्र कर रहे हैं। आम तौर पर बिट्स 0 से एन -1 तक गिने जाते हैं (जहां इस मामले में एन 16 है) –

+0

हाँ, अगर मुझे सही याद है तो क्यूईएमयू इस बिट को अनुकरण नहीं करता है लेकिन वर्चुअलबॉक्स करता है। –

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

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