कंप्यूटर कच्चे, निम्न-स्तरीय पाठ और ग्राफिक्स कैसे प्रदर्शित करते हैं


46

कंप्यूटर में मेरी बढ़ती दिलचस्पी मुझे गहरे सवाल पूछ रही है, कि हमें अब और नहीं लगता है। हमारे कंप्यूटर, बूट पर, जहां तक ​​मैं इसे समझता हूं, पाठ मोड में हैं , जिसमें एक चरित्र प्रदर्शित किया जा सकता है 0x10जब सॉफ्टवेयर रुकावट का उपयोग किया जाता है AH=0x0e। हम सभी ने प्रसिद्ध बूटिंग फ़ॉन्ट देखा है जो हमेशा एक जैसा दिखता है, भले ही कंप्यूटर बूट हो रहा हो।

तो, ओएस के नीचे, पृथ्वी, कंप्यूटर को सबसे निचले स्तर पर ग्राफिक्स आउटपुट कैसे देता है? और यह भी, निश्चित रूप से ग्राफिक्स को एक सॉफ्टवेयर का उपयोग करते हुए एक समय में पिक्सेल को आउटपुट नहीं किया जाता है, क्योंकि यह बहुत धीमा लगता है?

क्या कोई ऐसा मानक है जो वर्टिकल, पॉलीगॉन, फोंट आदि की बेसिक आउटपुटिंग को परिभाषित करता है (उदाहरण के लिए OpenGL के नीचे, जो OpenGL का उपयोग कर सकता है)? मुझसे क्या पूछती है कि ओएस 'आधिकारिक ड्राइवरों को स्थापित किए बिना अक्सर ठीक क्यों हो सकता है; वे यह काम कैसे करते हैं?

माफी अगर मेरी धारणा गलत है। मैं इन विषयों पर विस्तार के लिए बहुत आभारी रहूंगा!


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

जवाबों:


25

यह (आंशिक रूप से) BIOS की भूमिका है।

कंप्यूटर का बेसिक इनपुट आउटपुट सिस्टम वास्तविक कंप्यूटर के बीच इस तरह के अंतर के बावजूद ऑपरेटिंग सिस्टम को एक सामान्य इंटरफ़ेस प्रदान करने के लिए जिम्मेदार है।

उस ने कहा, विशेष रूप से ग्राफिक्स के लिए, स्क्रीन पर ड्राइंग के विभिन्न तरीके हैं। TTY कमांड हैं जिन्हें आप BIOS में भेज सकते हैं, लेकिन यह केवल वास्तविक मोड में है। यदि आप संरक्षित मोड में कुछ भी आकर्षित करना चाहते हैं, तो आपको चीजों को आकर्षित करने के लिए वीजीए का उपयोग करने की आवश्यकता है। मैं इसे OSDev से बेहतर नहीं समझा सकता, इसलिए यहां अधिक जानकारी के लिए देखें - लेकिन मूल रूप से, आप 0xB8000स्क्रीन पर चीजों को आकर्षित करने के लिए पते पर शुरू होने वाली मेमोरी (वीडियो मेमोरी मेमोरी-मैप्ड) लिख सकते हैं।

यदि आपको वीजीए से अधिक रिज़ॉल्यूशन की आवश्यकता है, तो आपको वीईएसए BIOS एक्सटेंशन का उपयोग करने की आवश्यकता है; मैं इससे परिचित नहीं हूं, लेकिन अधिक जानकारी के लिए GRUB स्रोत कोड देखने का प्रयास करें।

कुछ उपयोगी संदर्भ:


यदि आप D से परिचित हैं - मैंने थोड़ी देर पहले एक छोटा बूट लोडर लिखा था जो स्क्रीन (केवल पाठ) पर लिखने में सक्षम था। यदि आप रुचि रखते हैं, तो यहां कोड है:

align(2) struct Cell { char ch; ubyte flags = 0x07; }

@property Cell[] vram()
{ return (cast(Cell*)0xB8000)[0 .. CONSOLE_WIDTH * CONSOLE_HEIGHT]; }

void putc(char c)
{
    if (isBochs) { _outp(0xE9, c); }  // Output to the Bochs terminal!

    bool isNewline = c == '\n';
    while (cursorPos + (isNewline ? 0 : 1) > vram.length)
    {
        for (short column = CONSOLE_WIDTH - 1; column >= 0; column--)
        {
            foreach (row; 0 .. CONSOLE_HEIGHT - 1)
            {
                uint cell = column + cast(uint)row * CONSOLE_WIDTH;
                vram[cell] = vram[cell + CONSOLE_WIDTH];
            }
            vram[column + (CONSOLE_HEIGHT - 1) * CONSOLE_WIDTH].ch = ' ';
        }
        cursorPos = cast(ushort)(cursorPos - CONSOLE_WIDTH);
    }
    if (isNewline)
        cursorPos = cast(ushort)
            ((1 + cursorPos / CONSOLE_WIDTH) * CONSOLE_WIDTH);
    else vram[cursorPos++].ch = c;
}

void putc(char c, ubyte attrib) { vram[cursorPos] = Cell(c, attrib); }

void memdump(void* pMem, size_t length)
{
    foreach (i; 0 .. length)
        putc((cast(char*)pMem)[i]);
}

void clear(char clear_to = '\0', ubyte attrib = DEFAULT_ATTRIBUTES)
{
    foreach (pos; 0 .. vram.length)
        vram[pos] = Cell(clear_to, attrib);
    cursorPos = 0;
}

@property ushort cursorPos()
{
    ushort result = 0;
    _outp(0x3D4, 14);
    result += _inp(0x3D5) << 8;
    _outp(0x3D4, 15);
    result += _inp(0x3D5);
    return result;
}

@property void cursorPos(ushort position)
{
    _outp(0x3D4, 14);
    _outp(0x3D5, (position >> 8) & 0xFF);
    _outp(0x3D4, 15);
    _outp(0x3D5, position & 0xFF);
}

जवाब के लिए धन्यवाद। GRUB स्रोत कोड क्यों? मुझे नहीं पता था कि ग्राफिक्स के साथ GRUB शामिल है।
डोड्डी

2
@ चयन 2 जब ओएस चयन मेनू पर पृष्ठभूमि के रूप में एक छवि प्रदर्शित करने सहित कुछ दिलचस्प चीजें कर सकते हैं। ग्रब के बारे में निश्चित नहीं है।
इज़काता

@panic: मुझे यकीन नहीं है कि यह GRUB या GRUB2 है (मैंने उदारतापूर्वक "GRUB" का उपयोग किया है), लेकिन वे निश्चित रूप से मेरे मॉनिटर पर एक मूल 1600x900 संकल्प में स्विच कर सकते हैं, इसलिए मुझे यकीन है कि वे चीजें हैं जिन्हें आप देख सकते हैं। (मैंने कुछ समय पहले उन्हें देखा था, और मुझे याद है कि वे मददगार थे, लेकिन मुझे कुछ समय हो गया है इसलिए मुझे ठीक से याद नहीं है कि आपको कौन सी फाइल (फाइलों) को देखना चाहिए।)
मेहरदाद

क्या इस शब्द का memory-mappedअर्थ है कि रैम में एक "बफर" क्षेत्र है जहां सीपीयू (या एक और डीएमए इकाई है?) ग्राफिक्स कार्ड और प्रोग्राम दोनों की ओर से पढ़ और लिख सकता है जो डिस्प्ले पर लिखने की कोशिश करता है।
n611x007

1
@naxa: अच्छा सवाल ... आमतौर पर, मेमोरी मैप्ड हार्डवेयर का मतलब है कि मेमोरी में एक पता है जो वास्तव में रैम के अनुरूप नहीं है। बल्कि, इसे पढ़ना या लिखना कुछ हार्डवेयर पर कुछ क्रिया करने से मेल खाता है। उस ने कहा, मुझे यकीन नहीं है कि आप वास्तविक रैम और हार्डवेयर के बीच अंतर कैसे कर सकते हैं जो मेमोरी के ब्लॉक को रैम की तरह दिखता है ... ऐसा हो सकता है कि यह इस मामले में वास्तविक रैम हो, लेकिन मेरी धारणा यह थी कि पढ़ता है और लिखता है इंटरसेप्टेड हार्डवेयर द्वारा।
मेहरदाद

25

आईबीएम पीसी और उसके क्लोन के शुरुआती दिनों से, डिस्प्ले अडैप्टर हार्डवेयर बहुत सरल था: मेमोरी का एक छोटा ब्लॉक चरित्र कोशिकाओं (मानक मोड में 80x25 वर्ण) की एक ग्रिड के लिए समर्पित था, प्रत्येक सेल के लिए दो बाइट्स मेमोरी के साथ । एक बाइट ने चरित्र का चयन किया, और दूसरे ने अपनी "विशेषताओं" को चुना - अग्रभूमि और पृष्ठभूमि रंग और रंग एडेप्टर के लिए ब्लिंक नियंत्रण; मोनोक्रोम एडेप्टर के लिए बोल्ड, रेखांकित, ब्लिंकिंग या रिवर्स वीडियो। हार्डवेयर ने वर्ण स्मृति की सामग्री के अनुसार चरित्र आकृतियों की एक रोम तालिका से पिक्सल को देखा।

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

ग्राफिक्स मोड में, स्थिति समान थी; स्क्रीन पर प्रत्येक पिक्सेल मेमोरी में एक विशेष स्थान से जुड़ा हुआ है, और एक BIOS सेट-पिक्सेल इंटरफ़ेस था लेकिन उच्च प्रदर्शन कार्य को सीधे मेमोरी में लिखना आवश्यक था। VESA जैसे बाद के मानकों ने हार्डवेयर की मेमोरी लेआउट को सीखने के लिए सिस्टम को कुछ धीमे BIOS आधारित प्रश्नों को करने दिया, फिर सीधे मेमोरी के साथ काम करें। यह है कि एक ओएस एक विशेष ड्राइवर के बिना ग्राफिक्स कैसे प्रदर्शित कर सकता है, हालांकि आधुनिक ओएस में हर प्रमुख GPU निर्माता के हार्डवेयर के लिए बुनियादी ड्राइवर भी शामिल हैं। यहां तक ​​कि नवीनतम एनवीडिया कार्ड कई अलग-अलग बैकवर्ड संगतता मोड का समर्थन करेगा, शायद सभी आईबीएम सीजीए के लिए वापस।

3 डी ग्राफिक्स और 2 डी के बीच एक महत्वपूर्ण अंतर यह है कि 2 डी में आपको आम तौर पर हर फ्रेम को पूरी स्क्रीन को फिर से डिज़ाइन करने की आवश्यकता नहीं है। 3 डी में, अगर कैमरा थोड़ा सा भी हिलता है, तो स्क्रीन पर हर पिक्सेल बदल सकता है; 2 डी में, यदि आप स्क्रॉल नहीं कर रहे हैं, तो अधिकांश स्क्रीन अपरिवर्तित फ़्रेम-टू-फ़्रेम होंगे, और यहां तक ​​कि यदि आप स्क्रॉल कर रहे हैं, तो आप आम तौर पर पूरे दृश्य को फिर से जोड़ने के बजाय एक तेज़ मेमोरी-टू-मेमोरी कॉपी कर सकते हैं। तो यह हर पिक्सेल हर फ्रेम के लिए INT 10h को निष्पादित करने की तरह कुछ भी नहीं है।

स्रोत: मैं वास्तव में बूढ़ा हूँ


बहुत जानकारीपूर्ण, धन्यवाद। काश मैं एक से अधिक स्वीकार कर सकता!
Doddy

8

बूट के दौरान सिस्टम BIOS वीडियो एडेप्टर के लिए दिखता है। विशेष रूप से, यह वीडियो एडेप्टर के BIOS प्रोग्राम में बनाया गया है और इसे चलाता है। यह BIOS आम तौर पर मेमोरी में C000h स्थान पर पाया जाता है। सिस्टम BIOS वीडियो BIOS को निष्पादित करता है , जो वीडियो एडाप्टर को इनिशियलाइज़ करता है।

वीडियो / ग्राफिक्स के कौन से स्तर या मोड BIOS को ओएस या ड्राइवरों के बिना मूल रूप से प्रदर्शित कर सकते हैं, मुख्य रूप से वीडियो BIOS पर ही निर्भर है।

स्रोत / अधिक जानकारी यहाँ - "सिस्टम बूट अनुक्रम"


6

हमारे कंप्यूटर, बूट पर, जहाँ तक मैं इसे समझता हूँ, टेक्स्ट मोड में हैं, जिसमें AH = 0x0e होने पर सॉफ्टवेयर रुकावट 0x10 का उपयोग करके एक चरित्र प्रदर्शित किया जा सकता है।

आप विरासत BIOS कार्यों के बारे में बात कर रहे हैं। वास्तव में आपको ऐसे कार्यों का उपयोग करने की आवश्यकता नहीं है। आप उन्हें सीधे वीडियो मेमोरी में लिखते हैं।

OS के नीचे, धरती पर सबसे कम स्तर पर कंप्यूटर आउटपुट ग्राफिक्स कैसे कहते हैं?

यह दृढ़ता से करना है कि ओएस कैसे संचालित होता है। वैसे भी, ऑपरेशन हार्डवेयर स्तर पर समान है: वीडियो कार्ड में एक वीडियो रैम है, जो स्क्रीन पर खींची जाने वाली अगली छवि को संग्रहीत (सरल) करता है। आप सोच सकते हैं कि प्रत्येक पता एक बाइट है जो एक पिक्सेल का प्रतिनिधित्व करता है (वास्तव में आम तौर पर आपको प्रति पिक्सेल एक से अधिक बाइट की आवश्यकता होती है)। तब वीडियो नियंत्रक एक संकेत को मॉनिटर में समझने में अनुवाद करने का ध्यान रखता है।

क्या कोई ऐसा मानक है जो वर्टिकल, पॉलीगॉन, फोंट आदि की बेसिक आउटपुटिंग को परिभाषित करता है (उदाहरण के लिए OpenGL के नीचे, जो OpenGL का उपयोग कर सकता है)?

AFAIK, नहीं। तार्किक ग्राफिक अभ्यावेदन के बारे में कोई मानक नहीं हैं।

मुझसे क्या पूछती है कि ओएस 'आधिकारिक ड्राइवरों को स्थापित किए बिना अक्सर ठीक क्यों हो सकता है; वे यह काम कैसे करते हैं?

क्योंकि इसमें ड्राइवर पहले से ही OS के साथ बंडल किए गए हैं।

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