Um artigo recente levou à preparação deste material "Um bug no driver da placa de vídeo pode revelar o que foi visualizado no modo de navegação anônima ". Este artigo nasceu após a publicação da maneira trivial de exibir uma imagem pertencente a qualquer processo (inclusive finalizado), possivelmente até com reivindicações de proteção de informações.Como também estou envolvido no desenvolvimento de drivers gráficos, por acaso, tentarei explicar brevemente o que o autor do relatório de erro original está errado, a responsabilidade do problema e como ele pode ser resolvido.
Independentemente do sistema operacional, de suas APIs de sistema relacionadas e de interfaces de aplicativos para o desenvolvimento de aplicativos gráficos, um driver de placa de vídeo arbitrário resolve as seguintes tarefas em todo o sistema:- Inicialização do controlador de vídeo ( configuração do modo de vídeo, gerenciamento de portas GPU, formação de uma / várias imagens independentes, ... );
- Gerenciamento de memória endereçável ( filas de comando, endereçamento linear / lado a lado, alocação de superfície, tabelas de conversão de endereços, extensão de abertura PCI, ... );
- Aceleração 2D ( cursor, camadas de hardware, teclas alfa / chroma, ROP, primitivas, ... );
- Aceleração 3D ( OpenGL, OpenGL ES / EGL, OpenVG / EGL, OpenCL, Open * );
- Decodificação de vídeo / reprodução de áudio / subtração EDID / compactação de buffer de quadros, ...
As abordagens para a solução das tarefas aplicadas em cada estágio foram reduzidas a práticas estabelecidas. Isso apenas explica a reprodutibilidade do problema indicado em dispositivos de vários fabricantes. Olhando para o futuro, posso dizer que você pode obter um efeito semelhante nos controladores Intel. O autor do relatório de erros absolutamente determinado com precisão dentro da estrutura da solução em que problema surge o efeito - gerenciamento de memória endereçável.
Gerenciamento de memória
A principal entidade que o motorista está operando nesta fase é a superfície. Uma superfície é geralmente chamada de parte contínua de vídeo ou RAM usada para formar uma imagem por algum aplicativo. Para controladores que não possuem memória própria, um recurso alocado da RAM pode se tornar endereçável por meio de uma tabela de conversão de endereços (Tabela de conversão de gráficos, GTT). Caso contrário, a imagem poderá ser exibida apenas ao copiar a superfície na memória de vídeo, por meio do controlador DMA, se houver, ou devido aos recursos da CPU.De fato, mesmo controladores com sua própria memória discreta na maioria dos casos também o endereçam via GTT, pois dessa maneira é possível criar um espaço de endereço virtual por analogia com o TLB do processador central para fornecer endereçamento linear ou de bloco. O método de endereçamento em cada caso determina o driver e não há diferença fundamental entre eles na estrutura deste artigo.Exemplo de endereçamento de bloco na memória de vídeo do artigo de origem O driver do controlador gráfico é a interface do sistema operacional para a funcionalidade GPU, nada mais. Todas as tarefas para garantir a proteção das informações são atribuídas a qualquer nível superior responsável por isso. Para isso, os drivers têm todas as funcionalidades disponíveis, haveria um desejo de usá-lo.Portanto, a pedido de algum driver de cliente, o SO reserva (aloca) um conjunto de superfícies para ele. Como, de acordo com o autor, a fragmentação da imagem é relativamente rara, podemos argumentar que o endereçamento de blocos não é frequentemente usado nesses casos. Com o endereçamento linear, cada superfície é caracterizada principalmente pelo deslocamento desde o início do espaço de endereço virtual da memória do controlador. ao alocar memória, o driver retorna ao SO exatamente esse deslocamento, que corresponde a um bloco de memória livre que pode acomodar a superfície com as características solicitadas pelo software aplicativo. Nesse caso, o driver executa apenas as seguintes ações: modifica o GTT para uso posterior das páginas de memória virtual, monitora a conformidade com os requisitos de alinhamento de endereços físicos,define o mecanismo de acesso do software aplicativo à superfície (abertura PCI / GPU, por endereço físico fora da abertura, extensão GTT em tempo real), reserva uma parte da memória para suas próprias necessidades.Com base no exposto, podemos concluir que, com informações sobre a quantidade total de memória disponível do controlador e as características de superfície necessárias, a determinação do deslocamento para todos os controladores pode ser resolvida da mesma maneira. Na prática, este é o caso (guiado pela experiência com vários sistemas operacionais do tipo unix): o sistema operacional fornece um serviço / biblioteca de sistema que armazena uma lista de blocos de memória já usados e permite calcular rapidamente o primeiro deslocamento disponível para backup lógico nessa biblioteca. Ao mesmo tempo, tendo informações do driver sobre o mecanismo de acesso ao bloco de memória, o sistema operacional geralmente permite que o software aplicativo seja formado nos mesmos endereços físicos de superfícies compartilhadas / cruzadas.Se o driver não controla explicitamente as superfícies, como a aceleração é implementada?. - , , ( ), .
( ) , ( ), .
Voltando ao problema original
Certamente, neste ponto, muitos já adivinharam o que as críticas se resumem. Ao executar vários aplicativos, o sistema operacional solicita a superfície do driver de vídeo e as reutiliza à medida que a memória fica livre (encerramento do processo). Ao mesmo tempo, o driver não pode estar ciente de que algum bloco de memória requer redefinição imediata, pois possui certos requisitos de segurança e não possui outros links. Zerar a própria memória é uma tarefa trivial do hardware preencher um retângulo.De fato, o teste escrito para publicar o relatório de erros é redundante. No caso geral (quando a memória de vídeo se encaixa em uma abertura PCI / GPU), nenhuma API de aplicativo é necessária para sistemas do tipo unix. Basta entrar em contato com / dev / mem usando o deslocamento conhecido na saída do utilitário "lspci".Para os controladores Intel, a situação é diferente, mas não muito. Como o controlador não possui memória própria, o GTT é formado em tempo real com a alocação de memória da RAM. Ao realocar a superfície, pode simplesmente não ter sorte com a localização real do bloco de RAM, pois nesse caso o mecanismo de endereçamento virtual do SO já desempenha um papel decisivo.Existem várias soluções, e acredito que as conclusões serão óbvias:- Todos os fabricantes de drivers devem implementar funcionalidades redundantes para armazenar informações sobre superfícies existentes (a questão de controlar superfícies compartilhadas permanece em aberto );
- O sistema operacional deve monitorar a necessidade de esse ou aquele aplicativo arrumar ( essa é uma certa marcação das superfícies protegidas ou um zeramento excessivo de qualquer superfície na RAM e na memória de vídeo );
- O software do aplicativo deve se limpar corretamente, pois afirma estar envolvido na segurança da informação.
Espero que a nota tenha sido interessante.