48 votes

Comment les ordinateurs affichent des textes et des graphiques bruts, de bas niveau.

Mon intérêt grandissant pour l'informatique m'amène à me poser des questions plus profondes, que nous ne semblons plus avoir à nous poser. Nos ordinateurs, au début, d'après ce 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 fameuse police de démarrage qui se présente toujours de la même manière, quel que soit l'ordinateur qui démarre.

Alors, comment diable les ordinateurs peuvent-ils produire des graphiques au niveau le plus bas, c'est-à-dire en dessous du système d'exploitation ? De plus, les graphiques ne sont sûrement pas émis un pixel à la fois à l'aide d'interruptions logicielles, car cela semble très lent ?

Existe-t-il un standard qui définit la sortie de base des sommets, des polygones, des polices, etc. (en dessous d'OpenGL par exemple, qu'OpenGL pourrait utiliser) ? Ce qui me fait poser la question, c'est pourquoi les systèmes d'exploitation peuvent souvent fonctionner sans que des pilotes officiels soient installés ; comment font-ils cela ?

Je vous prie de m'excuser si mes hypothèses sont incorrectes. Je vous serais très reconnaissant de m'apporter des précisions sur ces sujets !

26voto

Eric Majerus Points 750

Dès les premiers jours de l'IBM PC et de ses clones, le matériel de l'adaptateur d'affichage était très simple : un petit bloc de mémoire était dédié à une grille de cellules de caractères (80x25 caractères dans le mode standard), avec deux octets de mémoire pour chaque cellule. Un octet sélectionnait le caractère et l'autre ses "attributs" - couleurs d'avant-plan et d'arrière-plan et contrôle du clignotement pour les adaptateurs couleur ; gras, souligné, clignotant ou vidéo inversée pour les adaptateurs monochromes. Le matériel de sortie vidéo recherchait les pixels dans une table ROM de 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 du BIOS avec la carte de caractères nécessitait l'exécution d'une interruption logicielle pour définir une seule cellule de caractère à l'écran. Cette procédure était lente et inefficace. Cependant, la mémoire de caractères était également directement adressable par le CPU, de sorte que si vous saviez quel matériel était présent, vous pouviez écrire directement dans la mémoire à la place. Quoi qu'il en soit, une fois défini, le caractère restait à l'écran jusqu'à ce qu'il soit modifié, et la mémoire de caractères totale avec laquelle vous deviez travailler était de 4 000 octets, soit à peu près la taille d'une texture couleur 32x32 d'aujourd'hui !

Dans les modes graphiques, la situation était similaire ; chaque pixel à l'écran est associé à un emplacement particulier dans la mémoire, et il existait une interface BIOS pour définir les pixels, mais les travaux de haute performance nécessitaient d'écrire directement dans la mémoire. Les normes ultérieures telles que VESA permettent au système d'effectuer quelques requêtes lentes basées sur le BIOS pour connaître la disposition de la mémoire du matériel, puis de travailler directement avec la mémoire. C'est ainsi qu'un système d'exploitation peut afficher des graphiques sans pilote spécialisé, bien que les systèmes d'exploitation modernes incluent également des pilotes de base pour le matériel de tous les grands fabricants de GPU. Même la carte NVidia la plus récente prend en charge plusieurs modes de rétrocompatibilité différents, qui remontent probablement jusqu'à IBM CGA.

Une différence importante entre les graphiques 3D et 2D est qu'en 2D, il n'est généralement pas nécessaire de redessiner l'ensemble de l'écran à chaque image. En 3D, si la caméra se déplace ne serait-ce qu'un tout petit peu, chaque pixel de l'écran peut changer ; en 2D, si vous ne faites pas défiler l'image, la majeure partie de l'écran restera inchangée d'une image à l'autre, et même si vous faites défiler l'image, vous pouvez généralement effectuer une copie rapide de mémoire à mémoire au lieu de recomposer l'ensemble de la scène. Il n'est donc pas nécessaire d'exécuter INT 10h pour chaque pixel à chaque image.

Source : Je suis vraiment vieux

25voto

user541686 Points 22852

C'est (en partie) le rôle du BIOS.

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

Cela dit, pour les graphiques en particulier, il existe différentes façons de dessiner à l'écran. Il existe des commandes TTY que vous pouvez envoyer au BIOS, mais uniquement en mode réel. Si vous voulez dessiner quoi que ce soit en mode protégé, vous devez utiliser VGA pour dessiner des choses. Je ne peux pas l'expliquer mieux que l'OSDev, alors regardez ici pour plus d'informations -- mais fondamentalement, vous pouvez écrire dans la mémoire (la mémoire vidéo est mappée en mémoire) à partir de l'adresse 0xB8000 pour dessiner des choses sur l'écran.

Si vous avez besoin d'une résolution supérieure à VGA, vous devez utiliser les extensions BIOS VESA ; je ne connais pas bien, mais essayez de regarder le code source de Grub pour plus d'informations.

Quelques références utiles :


Si vous êtes familier avec D, j'ai écrit un petit boot loader il y a quelque temps qui était capable d'écrire à l'écran (texte seulement). 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);
}

8voto

Brandon Points 2580

Pendant le démarrage, le système BIOS recherche l'adaptateur vidéo. En particulier, il recherche le programme BIOS intégré de l'adaptateur vidéo et l'exécute. Ce BIOS se trouve normalement à l'emplacement C000h dans la mémoire. Le BIOS système exécute le programme BIOS vidéo qui initialise l'adaptateur vidéo.

Les niveaux ou modes vidéo/graphiques que le BIOS peut afficher en mode natif, sans système d'exploitation ni pilotes, dépendent principalement du BIOS vidéo lui-même.

Source/plus d'informations ici - Séquence de démarrage du système"

6voto

m0skit0 Points 1337

Nos ordinateurs, au démarrage, dans la mesure où dans lequel un caractère peut être affiché en utilisant l'interruption logicielle 0x10 lorsque AH=0x0e

Il s'agit des fonctions héritées du BIOS. En fait, vous n'avez pas du tout besoin d'utiliser ces fonctions. Vous les écrivez directement dans la mémoire vidéo.

comment diable les ordinateurs peuvent-ils produire des graphiques à en dessous du système d'exploitation ?

Cela est fortement lié à la manière dont le système d'exploitation fonctionne. Quoi qu'il en soit, le fonctionnement est le même au niveau matériel : la carte vidéo possède une RAM vidéo, qui stocke (en simplifiant) la prochaine image à dessiner sur l'écran. On peut considérer que chaque adresse est un octet qui représente un pixel (en fait, il faut généralement plus d'un octet par pixel). Le contrôleur vidéo se charge ensuite de traduire cette adresse en un signal que le moniteur comprend.

Existe-t-il une norme qui définisse les polygones, polices, etc. (en dessous d'OpenGL par exemple, qu'OpenGL pourrait utiliser) ?

AFAIK, non. Il n'existe pas de normes concernant les représentations graphiques logiques.

Ce qui me fait poser la question, c'est la raison pour laquelle les systèmes d'exploitation peuvent souvent être corrects. officiels installés ; comment font-ils ?

Parce que les pilotes sont déjà inclus dans le système d'exploitation.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X