Come i computer visualizzano testo e grafica grezzi e di basso livello


46

Il mio interesse sempre crescente nei confronti dei computer mi sta spingendo a porre domande più profonde, che sembra che non dobbiamo più fare. I nostri computer, all'avvio, per quanto ho capito, sono in modalità testo , in cui un personaggio può essere visualizzato usando l'interruzione software 0x10quando AH=0x0e. Abbiamo visto tutti il ​​famoso carattere di avvio che sembra sempre lo stesso, indipendentemente dal computer che si sta avviando.

Quindi, come mai i computer producono grafica al livello più basso, per esempio, sotto il sistema operativo? Inoltre, sicuramente la grafica non viene emessa un pixel alla volta utilizzando gli interrupt di software, poiché sembra molto lento?

Esiste uno standard che definisce l'output di base di vertici, poligoni, caratteri, ecc. (Sotto OpenGL per esempio, che OpenGL potrebbe usare)? Ciò che mi fa chiedere è perché spesso i SO possono andare bene senza i driver ufficiali installati; come lo fanno?

Mi scuso se i miei presupposti sono errati. Sarei molto grato per l'elaborazione su questi argomenti!


Non sono tutti i computer, dipende dall'hardware del display. I PC basati sulla linea evolutiva IBM inizialmente avevano solo la modalità testo, quindi sono state aggiunte varie modalità grafiche. Abbiamo ancora quell'eredità. I computer più vecchi avevano spesso solo la modalità testo. Altri computer avevano solo modalità grafiche, come l'Amiga e i Macintoshes originali.
hippietrail,

Risposte:


25

Questo è (in parte) il ruolo del BIOS.

Il sistema di input input di base del computer è responsabile di fornire un'interfaccia comune ai sistemi operativi, nonostante tali differenze tra i computer effettivi.

Detto questo, in particolare per la grafica, ci sono diversi modi di disegnare sullo schermo. Ci sono comandi TTY che puoi inviare al BIOS, ma è solo in modalità reale. Se vuoi disegnare qualcosa in modalità protetta, devi usare VGA per disegnare le cose. Non posso spiegarlo meglio di OSDev, quindi guarda qui per maggiori informazioni - ma in sostanza, puoi scrivere in memoria (la memoria video è mappata in memoria) a partire dall'indirizzo 0xB8000per disegnare le cose sullo schermo.

Se hai bisogno di una risoluzione superiore a VGA, devi utilizzare le estensioni del BIOS VESA; Non ne ho familiarità, ma prova a guardare il codice sorgente di GRUB per maggiori informazioni.

Alcuni riferimenti utili:


Se hai familiarità con D - Ho scritto un po 'di boot loader che era in grado di scrivere sullo schermo (solo testo). Se sei interessato, ecco il codice:

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);
}

Grazie per la risposta. Perché il codice sorgente di GRUB? Non sapevo che GRUB fosse coinvolto nella grafica stessa.
Doddy,

2
@panic Grub2 può fare alcune cose interessanti, inclusa la visualizzazione di un'immagine come sfondo quando si è nel menu di selezione del SO. Non sono sicuro di grub.
Izkata,

@panic: Non sono sicuro che si tratti di GRUB o GRUB2 (ho usato "GRUB" genericamente), ma possono sicuramente passare a una risoluzione nativa 1600x900 sul mio monitor, quindi sono sicuro che avrebbero cose che puoi esaminare. (Li ho esaminati un po 'di tempo fa e ricordo che mi sono stati utili, ma è da un po' che non ricordo esattamente quale file dovresti cercare.)
Mehrdad

fa il termine memory-mappedsignifica che non c'è un "buffer" zona nella RAM in cui la CPU (o c'è un'altra unità DMA?) in grado di leggere e scrivere per conto di entrambi la scheda grafica e il programma che tenta di scrivere il display?
n611x007

1
@naxa: Buona domanda ... di solito, l'hardware mappato in memoria significa che c'è un indirizzo in memoria che in realtà non corrisponde alla RAM. Piuttosto, leggere o scrivere ad esso corrisponde a eseguire alcune azioni su alcuni hardware. Detto questo, non sono sicuro di come si possa distinguere tra RAM effettiva e hardware che fa sembrare un blocco di memoria simile alla RAM ... potrebbe essere in questo caso la RAM effettiva, ma la mia impressione è che intercettazioni in lettura e scrittura dall'hardware.
Mehrdad,

25

Sin dai primi tempi del PC IBM e dei suoi cloni, l'hardware dell'adattatore del display era molto semplice: un piccolo blocco di memoria era dedicato a una griglia di celle di caratteri (80x25 caratteri in modalità standard), con due byte di memoria per ogni cella . Un byte ha selezionato il carattere e l'altro ha selezionato i suoi "attributi": i colori di primo piano e di sfondo più il controllo lampeggiante per gli adattatori di colore; video in grassetto, sottolineato, lampeggiante o inverso per adattatori monocromatici. L'hardware ha cercato pixel da una tabella ROM di forme di carattere in base al contenuto della memoria dei caratteri.

Per offrire un certo grado di indipendenza hardware, l'interfaccia BIOS alla mappa dei caratteri ha richiesto l'esecuzione di un interrupt software per impostare una singola cella di caratteri sullo schermo. Questo è stato lento e inefficiente. Tuttavia, la memoria dei caratteri era direttamente indirizzabile anche dalla CPU, quindi se sapevi quale hardware era presente, puoi invece scrivere direttamente nella memoria. Ad ogni modo, una volta impostato, il personaggio rimarrebbe sullo schermo fino a quando non verrà modificato, e la memoria totale del personaggio che ti servirà per lavorare era di 4000 byte - circa le dimensioni di una singola trama a colori 32x32!

Nelle modalità grafiche, la situazione era simile; ogni pixel sullo schermo è associato a una particolare posizione in memoria e c'era un'interfaccia BIOS set-pixel, ma il lavoro ad alte prestazioni richiedeva la scrittura diretta in memoria. Standard successivi come VESA consentono al sistema di eseguire alcune query lente basate su BIOS per apprendere il layout di memoria dell'hardware, quindi lavorare direttamente con la memoria. Ecco come un sistema operativo può visualizzare la grafica senza un driver specializzato, sebbene i sistemi operativi moderni includano anche i driver di base per l'hardware dei principali produttori di GPU. Anche la più recente scheda NVidia supporterà diverse modalità di compatibilità all'indietro, probabilmente fino a IBM CGA.

Una differenza importante tra grafica 3D e 2D è che in 2D generalmente non è necessario ridisegnare l'intero schermo ogni fotogramma. In 3D, se la telecamera si sposta anche di un po ', ogni pixel sullo schermo potrebbe cambiare; in 2D, se non si scorre, la maggior parte dello schermo rimarrà invariata da fotogramma a fotogramma e anche se si sta scorrendo, in genere è possibile eseguire una veloce copia da memoria a memoria invece di ricomporre l'intera scena. Quindi non è niente come dover eseguire INT 10h per ogni pixel e ogni fotogramma.

Fonte: sono davvero vecchio


Molto istruttivo, grazie. Vorrei poterne accettare più di uno!
Doddy,

8

Durante l'avvio il BIOS di sistema cerca la scheda video. In particolare, cerca il programma BIOS incorporato della scheda video e lo esegue. Questo BIOS si trova normalmente nella posizione C000h in memoria. Il BIOS di sistema esegue il BIOS video , che inizializza la scheda video.

I livelli o le modalità di video / grafica che il BIOS può visualizzare in modo nativo, senza un sistema operativo o driver, dipendono principalmente dal BIOS video stesso.

Fonte / Ulteriori informazioni qui - "Sequenza di avvio del sistema"


6

I nostri computer, all'avvio, per quanto ho capito, sono in modalità testo, in cui un personaggio può essere visualizzato usando l'interruzione software 0x10 quando AH = 0x0e

Stai parlando di funzioni BIOS legacy. In effetti non è necessario utilizzare tali funzioni. Li scrivi direttamente nella memoria video.

come mai i computer producono grafica al livello più basso, per esempio, sotto il sistema operativo?

Ciò ha a che fare con il modo in cui funziona il sistema operativo. Ad ogni modo, l'operazione è la stessa a livello hardware: la scheda video ha una RAM video, che memorizza (semplificando) l'immagine successiva da disegnare sullo schermo. Puoi pensare che ogni indirizzo sia un byte che rappresenta un pixel (in realtà generalmente hai bisogno di più di un byte per pixel). Quindi il controller video si occupa di tradurre questo in un segnale che il monitor capisce.

Esiste uno standard che definisce l'output di base di vertici, poligoni, caratteri, ecc. (Sotto OpenGL per esempio, che OpenGL potrebbe usare)?

AFAIK, no. Non ci sono standard sulle rappresentazioni grafiche logiche.

Ciò che mi fa chiedere è perché spesso i SO possono andare bene senza i driver ufficiali installati; come lo fanno?

Perché ha già i driver in bundle con il sistema operativo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.