Como os computadores exibem texto e gráficos brutos e de baixo nível

45

Meu crescente interesse em computadores está me fazendo perguntas mais profundas, que parece que não precisamos mais perguntar. Nossos computadores, na inicialização, pelo que eu entendi, estão no modo de texto , no qual um caractere pode ser exibido usando o software interrompe 0x10 quando AH=0x0e . Todos nós já vimos a famosa fonte de inicialização que sempre parece a mesma, independentemente do computador que está sendo inicializado.

Então, como os computadores geram gráficos no nível mais baixo, digamos, abaixo do sistema operacional? E também, certamente os gráficos não são exibidos um pixel de cada vez usando interrupções de software, pois isso soa muito lento?

Existe um padrão que define a saída básica de vértices, polígonos, fontes etc. (abaixo do OpenGL, por exemplo, que o OpenGL pode usar)? O que me faz perguntar é por que o sistema operacional pode ficar bem sem drivers oficiais instalados; como eles fazem isso?

Desculpas se minhas suposições estiverem incorretas. Eu ficaria muito grato pela elaboração desses tópicos!

    
por Doddy 14.11.2011 / 18:05

4 respostas

24

Isso é (parcialmente) o papel do BIOS.

O Basic Input Output System do computador é responsável por fornecer uma interface comum aos sistemas operacionais, apesar dessas diferenças entre computadores reais.

Dito isso, especificamente para gráficos, existem diferentes maneiras de desenhar na tela. Existem comandos TTY que você pode enviar para o BIOS, mas isso é apenas no modo real. Se você quiser desenhar qualquer coisa no modo protegido, você precisará usar o VGA para desenhar coisas. Eu não posso explicar melhor do que o OSDev, então olhe aqui para mais informações - mas, basicamente, você pode escrever na memória (vídeo memória é mapeada na memória) começando no endereço 0xB8000 para desenhar coisas na tela.

Se você precisar de uma resolução maior que a VGA, você precisará usar as extensões de BIOS do VESA; Eu não estou familiarizado com isso, mas tente ver o código-fonte do GRUB para mais informações.

Algumas referências úteis:

Se você estiver familiarizado com D - eu escrevi um pequeno gerenciador de inicialização um tempo atrás que foi capaz de escrever na tela (somente texto). Se você estiver interessado, aqui está o código:

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 = '
grub-core/video/i386/pc/vbe.c
grub-core/video/i386/pc/vga.c
', 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); }
    
por 14.11.2011 / 18:27
25

Desde os primeiros dias do IBM PC e seus clones, o hardware do adaptador de vídeo era muito simples: um pequeno bloco de memória era dedicado a uma grade de células de caracteres (80x25 caracteres no modo padrão), com dois bytes de memória para cada célula. Um byte selecionou o caractere e o outro selecionou seus "atributos" - cores de primeiro e segundo plano, além de controle de intermitência para adaptadores de cores; negrito, sublinhado, piscando ou vídeo reverso para adaptadores monocromáticos. O hardware pesquisou pixels de uma tabela ROM de formas de caracteres de acordo com o conteúdo da memória de caracteres.

Para oferecer um certo grau de independência de hardware, a interface do BIOS para o mapa de caracteres exigia que uma interrupção de software fosse executada para definir uma única célula de caractere na tela. Isso foi lento e ineficiente. No entanto, a memória de caracteres também era endereçável diretamente pela CPU, portanto, se você soubesse qual hardware estava presente, poderia gravar diretamente na memória. De qualquer forma, uma vez definido, o personagem permaneceria na tela até ser alterado, e a memória total de caracteres com a qual você precisava trabalhar era de 4000 bytes - mais ou menos o tamanho de uma textura de cor única de 32x32!

Nos modos gráficos, a situação era similar; cada pixel na tela é associado a um local específico na memória, e havia uma interface de conjunto de pixels do BIOS, mas o trabalho de alto desempenho exigia gravar diretamente na memória. Padrões posteriores como o VESA permitem que o sistema faça algumas consultas lentas baseadas em BIOS para aprender o layout de memória do hardware e, em seguida, trabalhe diretamente com a memória. É assim que um sistema operacional pode exibir gráficos sem um driver especializado, embora sistemas operacionais modernos também incluam drivers básicos para o hardware de cada grande fabricante de GPU. Até mesmo a mais nova placa NVidia suportará vários modos de compatibilidade retroativa, provavelmente até o IBM CGA.

Uma diferença importante entre gráficos 3D e 2D é que, em 2D, geralmente não é necessário redesenhar toda a tela a cada quadro. Em 3D, se a câmera se mover até um pouquinho, cada pixel da tela pode mudar; em 2D, se você não estiver rolando, a maior parte da tela ficará inalterada quadro a quadro e, mesmo se estiver rolando, geralmente você pode fazer uma cópia rápida de memória para memória em vez de recompor toda a cena. Portanto, não é nada como ter que executar INT 10h para cada pixel em cada frame.

Fonte: eu sou muito velho

    
por 14.11.2011 / 20:02
8

Durante a inicialização, o BIOS do sistema procura o adaptador de vídeo. Em particular, ele procura o programa interno do adaptador de vídeo e o executa. Este BIOS é normalmente encontrado no local C000h na memória. O BIOS do sistema executa o BIOS de vídeo , que inicializa o adaptador de vídeo.

Quais níveis ou modos de vídeo / gráficos que o BIOS pode exibir nativamente, sem SO ou drivers, dependem principalmente do próprio BIOS de Vídeo.

Fonte / Mais informações aqui - "Seqüência de inicialização do sistema"

    
por 14.11.2011 / 18:27
6

Our computers, at boot, as far as I understand it, are in text mode, in which a character can be displayed using the software interrupt 0x10 when AH=0x0e

Você está falando sobre funções legadas do BIOS. Na verdade, você não precisa usar essas funções. Você os grava diretamente na memória de vídeo.

how on earth do computers output graphics at the lowest level, say, below the OS?

Isso tem a ver com o funcionamento do sistema operacional. De qualquer forma, a operação é a mesma no nível do hardware: a placa de vídeo possui uma RAM de vídeo, que armazena (simplificando) a próxima imagem a ser desenhada na tela. Você pode pensar que cada endereço é um byte que representa um pixel (geralmente você precisa de mais de um byte por pixel). Então o controlador de vídeo se encarrega de traduzir isso em um sinal que o monitor entende.

Is there a standard that defines basic outputting of vertices, polygons, fonts, etc. (below OpenGL for example, which OpenGL might use)?

AFAIK, não. Não há padrões sobre representações gráficas lógicas.

What makes me ask is why OS' can often be fine without official drivers installed; how do they do that?

Porque tem drivers já incluídos no sistema operacional.

    
por 14.11.2011 / 18:32