Um framebuffer é um arquivo de dispositivo que permite uma interface simplificada para a tela. Por exemplo, executando o código abaixo em um RaspberryPi com um monitor HDMI conectado:
cat /dev/urandom > /dev/fb1
Existem comandos ( fbi
, fim
) que permitem injetar imagens completas no framebuffer.
Existem vários recursos na internet ( ref1 , ref2 , ref3 ) tentando explicar com mais ou menos sucesso como adicionar um serviço systemd que resultará em uma imagem na tela.
Um fio comum nesses recursos é a menção tty
junto com o framebuffer
. (ou seja, ambos fbi
e fim
tem opções para passá-los a tty
).
Minha suposição era que a tty
é um conceito separado de a framebuffer
. O tty
usa o framebuffer
para enviar conteúdo para um usuário, mas o framebuffer não está de forma alguma vinculado a um arquivo tty
.
Existe uma relação oculta por trás de a tty
e a framebuffer
que poderia explicar por que os comandos para imprimir imagens em a framebuffer
parecem depender de a tty
?
A “relação oculta” está relacionada ao fato de o Linux suportar vários terminais virtuais, o que significa que o framebuffer pode ser usado por vários terminais diferentes. Programas que manipulam o framebuffer diretamente precisam estar cientes de qual terminal atualmente possui o framebuffer:
Quando tal programa é iniciado, ele precisa armazenar a configuração atual do terminal, então dizer ao kernel que deseja controlar a tela diretamente (ele muda para “modo gráfico” usando o
KDSETMODE
ioctl
) e configurar o framebuffer conforme necessário ( por exemplo , emfbi
, configure panorâmica). Ele também precisa informar ao kernel que deseja ser informado sobre os comutadores de terminal virtual (quando o usuário pressiona ).CtrlAltFnSe o usuário trocar de terminal, o kernel informará o programa em execução sobre isso; o programa precisa restaurar as configurações do terminal e abrir mão do controle sobre o terminal (
VT_RELDISP
) antes que a chave possa prosseguir.Se o usuário voltar para o terminal executando o programa baseado em framebuffer, o kernel novamente informa o programa sobre isso, e o programa configura o terminal e o framebuffer conforme necessário e restaura sua exibição.
Isso é descrito em detalhes em Como funciona a comutação VT .