domingo, 7 de setembro de 2014

O Console Framebuffer (Antonino Daplas)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256



Jaboatão dos Guararapes, PE, 07 de setembro de 2014.

Eis uma tradução livre para a lingua portuguesa falada no Brasil do 
texto da autoria de Antonino Daplas "The Framebuffer Console".   Tal 
texto vem junto com os códigos fontes do kernel Linux, estando o arquivo 
localizado sob o diretório Documentation/fb/fbcon.txt




O Console Framebuffer
=====================

 O console framebuffer (fbcon), como o nome implica, é um console 
de texto sendo executado no topo do dispositivo framebuffer.  Tem a 
funcionalidade de qualquer driver de console de texto padrão, tal qual o 
console VGA, com as características adicionadas que podem ser atribuídas 
à natureza gráfica do framebuffer.

 Na arquitetura x86, o console framebuffer é opcional, e alguns 
até mesmo o tratam como um brinquedo.  Para outras arquiteturas, é o 
único dispositivo de exibição disponível, texto ou gráfico.

 Quais são as características de fbcon? O console framebuffer 
suporta altas resoluções, variação de tipos de fontes, rotação de 
display, multicabeça primitivo, etc.   Teoricamente, fontes 
multi-coloridas, blending, aliasing, e qualquer característica feita 
disponível pela placa gráfica subjacente também é possível.

A. Configuração

 O console framebuffer pode ser habilitado utilizando sua 
ferramenta de configuração de kernel favorita.   Está sob Device 
Drivers->Graphics Support->Support for framebuffer devices->Framebuffer 
Console Support.   Selecione 'y' para compilar o suporte estaticamente, 
ou 'm' para suporte de módulo.   O módulo será fbcon.

 Para ativar o fbcon, pelo menos um driver framebuffer é exigido, 
então escolha um dos numerosos drivers disponíveis.   Para sistemas x86, 
eles quase universalmente tem placas VGA, de forma que vga16fb e vesafb 
sempre estarão disponíveis.   Entretanto, a utilização de um driver 
específico para o chipset da placa te dará mais velocidade e 
características, tais como a habilidade de mudar o modo de vídeo 
dinâmicamente.

 Para exibir o logotipo do pinguim, escolha qualquer logotipo 
disponível em Logo Configuration->Boot up logo.

 também, você precisará selecionar pelo menos uma fonte 
compilada-internamente, porém se você não fizer nada, a ferramenta de 
configuração de kernel selecionará uma para você, usualmente uma fonte 
8x16.

TRUQUE: Um relato comum de bug é a habilitação do framebuffer sem 
habilitar o console framebuffer.   Dependendo do driver, você poderá 
obter uma exibição preta ou truncada, porém o sistema ainda inicializa 
por completo.   Se você estiver com sorte em ter um driver que não 
altere o chip gráfico, então você ainda obterá um console VGA.

B. Carregamento

Cenários possíveis:

1. Driver e fbcon são compilados estaticamente

  Usualmente, fbcon automaticamente se apossará do seu console. 
  A notável exceção é vesafb.  Ele precisa ser explicitamente 
  ativado com o parâmetro de opção de inicialização vga=. [Nota 
  do tradutor: conforme a documentação do GNU GRUB, o parâmetro 
  "vga=" foi substituído por "resolution="]

2. Driver é compilado estaticamente, fbcon é compilado como um módulo

  Dependendo do driver, você obtém ou um console padrão, ou 
  uma exibição truncada, conforme mencionado acima.  Para obter um 
  console framebuffer, faça um 'modprobe fbcon'.

3. Driver é compilado como um módulo, fbcon é compilado estaticamente

  Você obtém seu console padrão.  Uma vez que o driver seja 
  carregado com 'modprobe xxxfb', fbcon automaticamente se 
  apossa do console com a possível exceção do uso da opção 
  fbcon=map:n.  Veja abaixo.

4. Driver e fbcon são compilados como um módulo.

  Você pode carregá-los em qualquer ordem.  Uma vez que ambos 
  estejam carregados, fbcon se apossará do console.

C. Opções de inicialização

  O console framebuffer tem várias, largamente desconhecidas, 
  opções de inicialização que podem modificar-lhe o 
  comportamento.

1. fbcon=font:<name>

  Seleciona a fonte inicial para uso.  O valor 'name' pode ser 
  qualquer das fontes compiladas-internamente: VGA8x16, 7x14, 
  10x18, VGA8x8, MINI4x6, RomanLarge, SUN8x16, SUN12x22, 
  ProFont6x11, Acorn8x8, PEARL8x8.

  Nota, nem todos os drivers podem lidar com fontes cujo tamanho 
  não seja divisível por 8, tais como vga16fb.

2. fbcon=scrollback:<value>[k]

 O buffer de rolagem é a memória que é utilizada para preservar o 
 conteúdo da exibição o qual já foi rolado ao passado de sua 
 visualiação.   Isso é acessado utilizando a combinação de teclas 
 Shift-PageUp.  O valor 'value' é qualquer inteiro. O padrão é 
 32KB.  O sufixo 'k' é opcional, e multiplicará o 'value' por 
 1024.

3. fbcon=map:<0123>

 Esta é uma opção interessante.  Ela diz qual driver é mapeado 
 para qual console.   O valor '0123' é uma sequência que é 
 repetida até que o comprimento total seja 64 que é o número 
 total de consoles disponíveis.   No exemplo acima, ela é 
 expandida para 012301230123... e o mapeamento será:

  tty | 1 2 3 4 5 6 7 8 9 ...
  fb  | 0 1 2 3 0 1 2 3 0 ...

  ('cat /proc/fb' deveria te dizer o que são os números 
  fb)

 Um efeito colateral que pode ser útil é utilizar um valor de 
 mapa que exceda o número de drivers fb carregados.   Por 
 exemplo, se apenas um driver estiver disponível, fb0, 
 adicionar fbcon=map:1 diz a fbcon para não se apossar do 
 console.

 Mais tarde, quando você quiser mapear o console para o 
 dispositivo framebuffer, você pode utilizar o utilitário 
 con2fbmap.

4. fbcon=vc:<n1>-<n2>

 Essa opção diz ao fbcon para apossar-se apenas de um intervalo 
 de consoles conforme especificado pelos valores 'n1' e 'n2'. 
 O restante dos consoles fora do intervalo dado ainda serão 
 controlados pelo driver de console padrão.

 NOTA: Para máquinas x86, o console padrão é o console VGA 
 o qual tipicamente está localizado na mesma placa de vídeo. 
 Assim, os consoles que são controlados pelo console VGA serão 
 truncados.

4. fbcon=rotate:<n>

 Essa opção altera o ângulo de orientação da exibição do console. 
 O valor 'n' aceita o seguinte:

       0 - orientação normal (0 graus)
       1 - orientação horária (90 graus)
       2 - orientação de cabeça para baixo (180 graus)
       3 - orientação anti-horária (270 graus)

 O ângulo pode ser alterado a qualquer tempo afterwards 
 'ecoando' os mesmos números para quaisquer um dos 2 atributos 
 encontrados em
  /sys/class/graphics/fbcon

  rotate     - rotaciona a exibição do console ativo
  rotate_all - rotaciona a exibição de todos os consoles

 A rotação de console apenas se tornará disponível se o Console
 Rotation Support estiver compilado em seu kernel.

 NOTA: Isto é puramente rotação de console.  Quisquer outras 
 aplicações que utilizem framebuffer permanecerão em suas 
 orientações 'normais'.  Atualmente, o driver fb subjacente é 
 totalmente ignorante acerca da rotação de console.

C. Anexando, Desanexando e Descarregando

Antes de ir adiante sobre como anexar, desanexar e descarregar o console 
framebuffer, uma ilustração das dependências pode ajudar.

A camada do console, como ocorre com a maioria dos subsistemas, precisa 
de um controlador que interaja com o hardware.   Assim, em um console 
VGA:

console ---> controlador VGA ---> hardware.

Presumindo que o controlador VGA pode ser descarregado, uma pessoa deve 
primeiro desvincular o controlador VGA da camada de console antes de 
descarregar o controlador.   O controlador VGA não pode ser descarregado 
se ele estiver ainda vinculado à camada de console. (Veja 
Documentation/console/console.txt para mais informação).

Isso é mais complicado no caso do console framebuffer (fbcon), pois 
fbcon é uma camada intermediária entre o console e os drivers:

console ---> fbcon ---> controladores fbdev ---> hardware

Os controladores fbdev não podem ser descarregados se eles estiverem 
vinculados ao fbcon, e fbcon não pode ser descarregado se ele estiver 
vinculado à camada de console.

Assim, para descarregar os controladores fbdev, uma pessoa deve primeiro 
desvincular fbcon do console, então desvincular os controladores fbdev 
do fbcon.   Felizmente, a desvinculação de fbcon da camada de console 
automaticamente desvinculará os controladores framebuffer do fbcon.   
Assim, não existe necessidade de desvincular explicitamente os 
controladores fbdev do fbcon.

Então, como nós desvinculamos fbcon do console? Parte da resposta está 
em Documentation/console/console.txt.   Para resumir:

Ecôe um valor para o arquivo de vínculo que representa o controlador de 
console framebuffer.   Assim, presumindo que vtcon1 representa fbcon, 
então:

echo 1 > sys/class/vtconsole/vtcon1/bind - anexa o console framebuffer 
        à camada de console

echo 0 > sys/class/vtconsole/vtcon1/bind - desanexa o console framebuffer 
        da camada de console

Se fbcon for desanexado da camada de console, seu controlador de 
inicialização de console (o qual é usualmente modo de texto VGA) 
assumirá o controle.   Uns poucos controladores (rivafb e i810fb) 
restaurarão o modo de texto VGA para você.   Com o resto, antes de 
desanexar fbcon, você deve tomar uns poucos passos adicionais para ter 
certeza de que seu modo texto VGA está restaurado adequadamente.   O 
seguinte é um dos vários métodos que você pode fazer:

1. Download ou instale vbetool.   Esse utilitário está incluído na 
   maioria das distribuições atuais, e é usualmente parte da ferramenta de 
   suspender/restaurar.

2. Na configuração de seu kernel, assegure-se de que 
   CONFIG_FRAMEBUFFER_CONSOLE está configurado para 'y' or 'm'.  
   Habilite um ou mais dos seus controladores de framebuffer preferidos.

3. Inicialize no modo texto e como root execute:

 vbetool vbestate save > <arquivo estado vga>

 O comando acima salva o conteúdo dos registradores do seu 
 hardware gráfico para <arquivo estado vga>.   Você precisa fazer 
 esse passo apenas uma vez, já que o arquivo de estado pode ser 
 reutilizado.

4. Se fbcon for compilado como um módulo, carregue fbcon fazendo:

       modprobe fbcon

5. Agora, para desanexar fbcon:

       vbetool vbestate restore < <arquivo estado vga> && \
       echo 0 > /sys/class/vtconsole/vtcon1/bind

6. Isso é tudo, você está de volta ao modo VGA.   E se você compilou 
fbcon como um módulo, você pode descarregá-lo com 'rmmod fbcon'

7. Para reanexar fbcon:

       echo 1 > /sys/class/vtconsole/vtcon1/bind

8. Uma vez que fbcon estiver desvinculado, todos os controladores 
registrados no sistema também se tornarão desvinculados.   Isso 
significa que aquele fbcon e controladores individuais framebuffer podem 
ser descarregados ou recarregados à vontade.   Recarregar os 
controladores ou fbcon automaticamente vinculará o console, fbcon e os 
controladores juntos.   Descarregar todos os controladores sem 
descarregar fbcon tornará impossível para o console vincular fbcon.


Notas para usuários vesafb:
==========================

Infelizmente, se a sua linha de comando de inicialização incluir um 
parâmetro vga=xxx que configura o hardware em modo gráfico, tal como 
quando carregar vesafb, vgacon não carregará.   Em vez disso, vgacon 
substituirá o console de inicialização padrão por dummycon, e você não 
obteria qualquer display após desanexar fbcon.   Sua máquina ainda está 
viva, então você pode reanexar vesafb.   Entretanto, para reanexar 
vesafb, você precisa fazer um dos seguintes:


Variação 1:

    a. Antes de desanexar fbcon, faça

       vbetool vbemode save > <arquivo estado vesa> # faça uma vez 
                 para cada modo 
                 vesafb,
          # o arquivo pode 
          ser reutilizado

    b. Desanexe fbcon como no passo 5.

    c. Anexe fbcon

        vbetool vbestate restore < <arquivo estado vesa> && \
 echo 1 > /sys/class/vtconsole/vtcon1/bind

Variação 2:

    a. Antes de desanexar fbcon, faça:
 echo <ID> > /sys/class/tty/console/bind


       vbetool vbemode get

    b. Tome nota do número do modo

    b. Desanexe fbcon como no passo 5.

    c. Anexe fbcon:

       vbetool vbemode set <número do modo> && \
       echo 1 > /sys/class/vtconsole/vtcon1/bind

Amostras:
========

aqui estão 2 amostras de scripts bash que você pode utilizar para 
vicular ou desvincular o controlador de console framebuffer se você 
estiver em uma caixa X86

- - ---------------------------------------------------------------------------
#!/bin/bash
# Desvincula fbcon

# Mude isto para onde seu arquivo vgastate atual estiver localizado
# Ou Utilize VGASTATE=$1 para indicar o arquivo de estado em tempo de execução
VGASTATE=/tmp/vgastate

# caminho para a ferramenta vbe
VBETOOL=/usr/local/bin


for (( i = 0; i < 16; i++))
do
  if test -x /sys/class/vtconsole/vtcon$i; then
      if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
           = 1 ]; then
     if test -x $VBETOOL/vbetool; then
        echo Unbinding vtcon$i
        $VBETOOL/vbetool vbestate restore < $VGASTATE
        echo 0 > /sys/class/vtconsole/vtcon$i/bind
     fi
      fi
  fi
done

- - ---------------------------------------------------------------------------
#!/bin/bash
# Vincula fbcon

for (( i = 0; i < 16; i++))
do
  if test -x /sys/class/vtconsole/vtcon$i; then
      if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
           = 1 ]; then
   echo Unbinding vtcon$i
   echo 1 > /sys/class/vtconsole/vtcon$i/bind
      fi
  fi
done
- - ---------------------------------------------------------------------------

- - --
Antonino Daplas <adaplas@pol.net>



Jamenson Ferreira Espindula de Almeida Melo
Usuário Linux nº 166197
https://linuxcounter.net/cert/166197.png

Impressão digital da chave:
234D 1914 4224 7C53 BD13  6855 2AE0 25C0 08A8 6180


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQEcBAEBCAAGBQJUDAZOAAoJECrgJcAIqGGARYEH+wU6XL+cf03EhATGkPBCsUOt
clzKY9qS2OSsnnTCdyv/cBRyZzbF3dzKBYWLDwm0duNhAwPCZ+sx1hCCFw+s8j+b
O6a0ZjhUpOCHukYdKWp9hZ3SRrGfHDWjEimZ9G1BCfbRQ4GQa/PGPCIupN+10aWI
0wpWyD+Fu8gxOdOvBSCZQ9s4nCghNo7XOu9Eif4Td+1gGhy3CXidiY4nwVvf7dKc
ggHANj3FprQQgcYc9E1deGc/j/kIDxUzus4Kx0Xg/lUpigEDP9dJ7s7apgS0tk5B
HXzh0085Lnn9Fv4p/hLbClVoqe1R7IoPkJ3tFeuj7lWXoACuiit/f7SBwzlLTBk=
=X/BN
-----END PGP SIGNATURE-----

Nenhum comentário:

Postar um comentário