web-dev-qa-db-fra.com

Comment les ordinateurs affichent du texte brut, de bas niveau et des graphiques

Mon intérêt toujours croissant pour les ordinateurs me fait demander des questions plus profondes, que nous ne semblons plus avoir à demander. Nos ordinateurs, au démarrage, autant que je comprends, sont en mode texte , dans lequel un caractère peut être affiché à l'aide de l'interruption logicielle 0x10 Quand AH=0x0e . Nous avons tous vu la célèbre police de démarrage qui a toujours l'air identique, quel que soit le démarrage de l'ordinateur.

Alors, comment sur Terre les ordinateurs distribuent-ils des graphiques les plus bas, disons, sous le système d'exploitation? Et aussi, ces graphiques ne sont certainement pas émis un pixel à la fois en utilisant des interruptions de logiciels, car cela sonne très lentement?

Existe-t-il une norme qui définit la sortie de base des sommets, des polygones, des polices, etc. (ci-dessous OpenGL par exemple, que OpenGL pourrait utiliser)? Ce qui me fait demander, c'est pourquoi le système d'exploitation peut souvent être bien sans pilotes officiels installés; Comment font-ils cela?

Toutes mes excuses si mes hypothèses sont incorrectes. Je serais très reconnaissant de l'élaboration de ces sujets!

46
Doddy

C'est (partiellement) le rôle du BIOS.

Le système de sortie d'entrée de base de l'ordinateur est chargé de fournir une interface commune aux systèmes d'exploitation, malgré de telles différences entre les ordinateurs réels.

Cela dit, pour les graphiques spécifiquement, il existe différentes manières de dessiner à l'écran. Il y a des commandes TTY que vous pouvez envoyer au BIOS, mais ce n'est que en mode réel. Si vous souhaitez dessiner quoi que ce soit en mode protégé, vous devez utiliser VGA pour dessiner des choses. Je ne peux pas l'expliquer mieux qu'Osdev, alors regardez ici pour plus d'informations - mais essentiellement, vous pouvez écrire en mémoire (la mémoire vidéo est mappée sur la mémoire) à partir de l'adresse 0xB8000 dessiner des choses à l'écran.

Si vous avez besoin d'une résolution plus élevée que VGA, vous devez utiliser les extensions du BIOS VESA; Je ne le connais pas, mais essayez de regarder le GRUB code pour plus d'informations.

Quelques références utiles:


Si vous êtes familiarisé avec D -, j'ai écrit un petit chargeur de démarrage pendant le retour qui a été capable d'écrire à l'écran (texte uniquement). Si vous êtes intéressé, voici le 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);
}
25
user541686

Dès les premiers jours du PC IBM et de ses clones, le matériel d'adaptateur d'affichage était très simple: un petit bloc de mémoire était dédié à une grille de cellules de caractère (caractères 80x25 en mode standard), avec deux octets de mémoire pour chaque cellule . Un octet a choisi le caractère, et l'autre a sélectionné ses "attributs" - Couleurs de premier plan et d'arrière-plan, ainsi que le contrôle des clignotants pour les adaptateurs de couleurs; Vidéo audacieuse, soulignée, clignotante ou inversée pour adaptateurs monochromes. Le matériel leva les pixels de A ROM Table des formes de caractères en fonction du contenu de la mémoire de caractères.

Afin d'offrir un certain degré d'indépendance matérielle, l'interface BIOS à la carte de caractères nécessitait une interruption logicielle à exécuter afin de définir une cellule de caractères unique à l'écran. C'était lent et inefficace. Cependant, la mémoire de caractères était également adressable directement par la CPU, donc si vous saviez quel matériel était présent, vous pouvez écrire directement en mémoire à la place. Quoi qu'il en soit, une fois défini, le personnage resterait à l'écran jusqu'à ce qu'il soit modifié et la mémoire totale de caractère que vous aviez besoin de travailler était de 4000 octets - à peu près la taille d'une seule texture de couleur 32x32!

Dans les modes graphiques, la situation était similaire; Chaque pixel à l'écran est associé à un emplacement particulier en mémoire et il y avait une interface de pixel de BIOS, mais une fonction haute performance requise par écrit directement à la mémoire. Les normes ultérieures telles que VESA, laissez le système faire quelques requêtes à base de bios lents pour apprendre la disposition de la mémoire du matériel, puis travailler directement avec la mémoire. C'est la manière dont un système d'exploitation peut afficher des graphiques sans pilote spécialisé, bien que les OSES modernes comprennent également des pilotes de base pour chaque matériel de fabricant GPU majeur. Même la nouvelle carte NVIDIA prend en charge plusieurs modes de compatibilité à l'envers différents, probablement jusqu'à IBM CGA.

Une différence importante entre les graphiques 3D et le 2D est que, dans 2D, vous n'avez généralement pas besoin de redessiner tout l'écran. En 3D, si la caméra se déplace même un minuscule un peu, chaque pixel sur l'écran pourrait changer; En 2D, si vous ne faites pas défiler, la majeure partie de l'écran sera inchangée du cadre à l'image et même si vous faites défiler, vous pouvez généralement effectuer une copie de mémoire rapide à mémoire au lieu de recomposer toute la scène. Donc, ce n'est rien comme avoir à exécuter int 10h pour chaque pixel chaque cadre.

Source: Je suis vraiment vieux

25
Russell Borogove

Pendant le démarrage, le système [~ # ~] BIOS [~ # ~ # ~] Recherche de l'adaptateur vidéo. En particulier, il cherche le programme BIOS intégré de l'adaptateur vidéo et le gère. Ce BIOS est normalement trouvé à l'emplacement C000H en mémoire. Le BIOS du système exécute le BIOS vidéo , qui initialise l'adaptateur vidéo.

Quels niveaux ou modes de vidéo/graphiques que le BIOS peut afficher Nativement, sans OS ou pilotes, est principalement dépendant du BIOS de la vidéo.

source/plus info ici - "Séquence de démarrage du système"

8
Ƭᴇcʜιᴇ007