Wie Computer einfachen Text und Grafiken anzeigen

46

Mein stetig wachsendes Interesse an Computern lässt mich tiefere Fragen stellen, die wir anscheinend nicht mehr stellen müssen. Unsere Computer, beim Booten, soweit ich es verstehe, sind im Textmodus , in dem ein Zeichen angezeigt wird , kann mit Hilfe des Software - Interrupt 0x10bei AH=0x0e. Wir haben alle die berühmte Boot-Schriftart gesehen, die immer gleich aussieht, unabhängig davon, welcher Computer bootet.

Wie um alles in der Welt geben Computer Grafiken beispielsweise unterhalb des Betriebssystems auf der niedrigsten Ebene aus? Und Grafiken werden mit Software-Interrupts sicherlich nicht pixelweise ausgegeben, da dies sehr langsam klingt?

Gibt es einen Standard, der die grundlegende Ausgabe von Eckpunkten, Polygonen, Schriftarten usw. definiert (beispielsweise unter OpenGL, die OpenGL möglicherweise verwendet)? Was mich fragen lässt, ist, warum Betriebssysteme oft ohne installierte offizielle Treiber funktionieren. Wie haben sie das gemacht?

Entschuldigung, wenn meine Annahmen falsch sind. Ich wäre sehr dankbar für die Ausarbeitung dieser Themen!

Doddy
quelle
Es sind nicht alle Computer, es hängt von der Display-Hardware ab. PCs, die auf der IBM Evolutionslinie basierten, verfügten ursprünglich nur über einen Textmodus. Anschließend wurden verschiedene Grafikmodi hinzugefügt. Wir haben immer noch dieses Erbe. Ältere Computer hatten oft nur Textmodus. Andere Computer hatten nur Grafikmodi, wie der Amiga und die ursprünglichen Macintosh-Computer.
Hippietrail

Antworten:

25

Das ist (teilweise) die Rolle des BIOS.

Das Basic Input Output System des Computers ist dafür verantwortlich, trotz solcher Unterschiede zwischen den tatsächlichen Computern eine gemeinsame Schnittstelle zu Betriebssystemen bereitzustellen.

Das heißt, für Grafiken gibt es verschiedene Möglichkeiten, auf dem Bildschirm zu zeichnen. Es gibt TTY-Befehle, die Sie an das BIOS senden können, aber das ist nur im Real-Modus. Wenn Sie etwas im geschützten Modus zeichnen möchten, müssen Sie VGA zum Zeichnen verwenden. Ich kann es nicht besser erklären als OSDev, also schau hier nach mehr Informationen - aber grundsätzlich kannst du in den Speicher schreiben (der Videospeicher ist speicherabgebildet), beginnend mit der Adresse, 0xB8000um Dinge auf dem Bildschirm zu zeichnen.

Wenn Sie eine höhere Auflösung als VGA benötigen, müssen Sie die VESA-BIOS-Erweiterungen verwenden. Ich bin damit nicht vertraut, aber versuche, im GRUB-Quellcode weitere Informationen zu finden.

Einige nützliche Hinweise:


Wenn Sie mit D vertraut sind, habe ich vor einiger Zeit einen kleinen Bootloader geschrieben, der in der Lage war, auf den Bildschirm zu schreiben (nur Text). Wenn Sie interessiert sind, ist hier der Code:

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);
}
Mehrdad
quelle
Danke für die Antwort. Warum der GRUB-Quellcode? Ich wusste nicht, dass sich GRUB selbst mit Grafik befasst.
Doddy
2
@panic Grub2 kann einige interessante Dinge tun, darunter das Anzeigen eines Bilds als Hintergrund im OS-Auswahlmenü. Ich bin mir nicht sicher, was Grub betrifft.
Izkata
@panic: Ich bin mir nicht sicher, ob es sich um GRUB oder GRUB2 handelt (ich habe "GRUB" generisch verwendet), aber sie können definitiv auf eine native Auflösung von 1600x900 auf meinem Monitor umschalten, sodass ich mir sicher bin, dass sie Dinge haben, die Sie sich ansehen können. (Ich habe sie vor einiger Zeit untersucht, und ich erinnere mich, dass sie hilfreich waren, aber es ist eine Weile her, und ich erinnere mich nicht genau, in welchen Dateien Sie suchen sollten.)
Mehrdad
Bedeutet der Begriff memory-mapped, dass es einen "Puffer" -Bereich im RAM gibt, in dem die CPU (oder eine andere DMA-Einheit?) im Namen der Grafikkarte und des Programms, das versucht, auf das Display zu schreiben, lesen und schreiben kann?
n611x007
1
@naxa: Gute Frage ... in der Regel bedeutet speicherzugeordnete Hardware, dass sich im Speicher eine Adresse befindet, die nicht dem RAM entspricht. Das Lesen oder Schreiben entspricht eher einer Aktion auf einer Hardware. Trotzdem bin ich mir nicht sicher, wie Sie zwischen tatsächlichem RAM und Hardware unterscheiden können, die einen Speicherblock wie RAM aussehen lässt. In diesem Fall könnte es sein, dass es sich tatsächlich um RAM handelt. Mein Eindruck war jedoch, dass Lese- und Schreibvorgänge abgefangen werden durch Hardware.
Mehrdad
25

Seit den Anfängen des IBM-PCs und seiner Klone war die Hardware des Anzeigeadapters sehr einfach: Ein kleiner Speicherblock war einem Raster von Zeichenzellen (80 x 25 Zeichen im Standardmodus) mit zwei Byte Speicher für jede Zelle zugeordnet . Ein Byte wählte das Zeichen und das andere die "Attribute" aus - Vordergrund- und Hintergrundfarbe sowie Blinksteuerung für Farbadapter; Fett, unterstrichen, blinkend oder invertiert bei Monochrom-Adaptern. Die Hardware hat Pixel aus einer ROM-Tabelle von Zeichenformen gemäß dem Inhalt des Zeichenspeichers nachgeschlagen.

Um ein gewisses Maß an Hardwareunabhängigkeit zu bieten, musste für die BIOS-Schnittstelle zur Zeichentabelle ein Software-Interrupt ausgeführt werden, um eine einzelne Zeichenzelle auf dem Bildschirm festzulegen. Dies war langsam und ineffizient. Der Zeichenspeicher war jedoch auch direkt von der CPU adressierbar. Wenn Sie also wissen, welche Hardware vorhanden ist, können Sie stattdessen direkt in den Speicher schreiben. In beiden Fällen blieb das Zeichen auf dem Bildschirm, bis es geändert wurde, und der gesamte Zeichenspeicher, mit dem Sie arbeiten mussten, betrug 4000 Byte - ungefähr die Größe einer einzelnen 32x32-Vollfarbtextur!

In den Grafikmodi war die Situation ähnlich; Jedes Pixel auf dem Bildschirm ist mit einer bestimmten Stelle im Speicher verknüpft, und es gab eine BIOS-Set-Pixel-Schnittstelle, für die jedoch Hochleistungsarbeit erforderlich war, die direkt in den Speicher geschrieben wurde. Spätere Standards wie VESA lassen das System einige langsame BIOS-basierte Abfragen durchführen, um das Speicherlayout der Hardware zu erlernen, und arbeiten dann direkt mit dem Speicher. Auf diese Weise kann ein Betriebssystem Grafiken ohne einen speziellen Treiber anzeigen, obwohl moderne Betriebssysteme auch Basistreiber für die Hardware aller großen GPU-Hersteller enthalten. Selbst die neueste NVidia-Karte unterstützt mehrere verschiedene Abwärtskompatibilitätsmodi, wahrscheinlich bis zu IBM CGA.

Ein wichtiger Unterschied zwischen 3D-Grafiken und 2D besteht darin, dass Sie in 2D im Allgemeinen nicht den gesamten Bildschirm für jeden Frame neu zeichnen müssen. Wenn sich die Kamera in 3D nur geringfügig bewegt, ändert sich möglicherweise jedes Pixel auf dem Bildschirm. Wenn Sie in 2D nicht scrollen, bleibt der größte Teil des Bildschirms von Bild zu Bild unverändert. Selbst wenn Sie scrollen, können Sie im Allgemeinen eine schnelle Kopie von Speicher zu Speicher erstellen, anstatt die gesamte Szene neu zusammenzusetzen. Es ist also nichts anderes, als INT 10h für jedes Pixel und jeden Frame ausführen zu müssen.

Quelle: Ich bin sehr alt

Russell Borogove
quelle
Sehr informativ, danke. Ich wünschte, ich könnte mehr als eine annehmen!
Doddy
8

Während des Startvorgangs sucht das System- BIOS nach der Grafikkarte. Insbesondere wird das im BIOS integrierte Programm der Grafikkarte gesucht und ausgeführt. Dieses BIOS befindet sich normalerweise an Position C000h im Speicher. Das System-BIOS führt das Video-BIOS aus , das den Videoadapter initialisiert.

Welche Ebenen oder Modi von Video / Grafik das BIOS ohne Betriebssystem oder Treiber nativ anzeigen kann, hängt in erster Linie vom Video-BIOS selbst ab.

Quelle / Weitere Informationen hier - "Systemstartsequenz"

ƬᴇcƬᴇιʜ007
quelle
6

Soweit ich weiß, befinden sich unsere Computer beim Booten im Textmodus, in dem ein Zeichen mit dem Software-Interrupt 0x10 angezeigt werden kann, wenn AH = 0x0e

Sie sprechen über ältere BIOS-Funktionen. Tatsächlich müssen Sie solche Funktionen überhaupt nicht verwenden. Sie schreiben sie direkt in den Videospeicher.

Wie um alles in der Welt geben Computer Grafiken auf der niedrigsten Ebene aus, beispielsweise unterhalb des Betriebssystems?

Dies hängt stark davon ab, wie das Betriebssystem funktioniert. Wie auch immer, die Bedienung ist auf Hardware-Ebene gleich: Die Grafikkarte verfügt über einen Video-RAM, in dem das nächste auf dem Bildschirm zu zeichnende Bild gespeichert (vereinfacht) wird. Sie können sich vorstellen, dass jede Adresse ein Byte ist, das ein Pixel darstellt (im Allgemeinen benötigen Sie mehr als ein Byte pro Pixel). Der Videocontroller sorgt dann dafür, dass dies in ein Signal umgewandelt wird, das der Monitor versteht.

Gibt es einen Standard, der die grundlegende Ausgabe von Eckpunkten, Polygonen, Schriftarten usw. definiert (beispielsweise unter OpenGL, die OpenGL möglicherweise verwendet)?

AFAIK, nein. Es gibt keine Standards für logische grafische Darstellungen.

Was mich fragen lässt, ist, warum Betriebssysteme oft ohne installierte offizielle Treiber funktionieren. Wie haben sie das gemacht?

Weil es Treiber hat, die bereits mit dem Betriebssystem gebündelt sind.

m0skit0
quelle