Controlador de tarjeta gráfica: ¿De quién es el error?

Un artículo reciente impulsó la preparación de este material "Un error en el controlador de la tarjeta de video puede revelar lo que se vio en modo incógnito" . Este artículo nació después de la publicación de la forma trivial de mostrar una imagen que pertenece a cualquier proceso (incluido el finalizado), posiblemente incluso con reclamos para proteger la información.

Como también estoy involucrado en el desarrollo de controladores gráficos, por casualidad, intentaré explicar brevemente con qué está equivocado el autor del informe de error original, la responsabilidad del problema y cómo se puede resolver.



Independientemente del sistema operativo, sus API de sistema relacionadas y las interfaces de aplicación para desarrollar aplicaciones gráficas, un controlador de tarjeta de video arbitrario resuelve las siguientes tareas de todo el sistema:

  • Inicialización del controlador de pantalla ( configuración del modo de video, gestión de puertos GPU, formación de una / varias imágenes independientes, ... );
  • Gestión de memoria direccionable ( colas de comandos, direccionamiento lineal / en mosaico, asignación de superficie, tablas de traducción de direcciones, extensión de apertura PCI, ... );
  • Aceleración 2D ( cursor, capas de hardware, teclas alfa / croma, ROP, primitivas, ... );
  • Aceleración 3D ( OpenGL, OpenGL ES / EGL, OpenVG / EGL, OpenCL, Open * );
  • Decodificación de video / reproducción de audio / sustracción EDID / compresión de frame buffer, ...

Los enfoques para la solución de las tareas aplicadas en cada etapa se han reducido durante mucho tiempo a las prácticas establecidas. Esto solo explica la reproducibilidad del problema indicado en dispositivos de varios fabricantes. Mirando hacia el futuro, puedo decir que puede obtener un efecto similar en los controladores Intel. El autor del informe de error determinó con absoluta precisión dentro del marco de la solución de qué problema surge el efecto: la gestión de memoria direccionable.



Gestión de la memoria


La entidad principal que el controlador está operando en esta etapa es la superficie. Una superficie generalmente se llama una pieza continua de video o RAM utilizada por alguna aplicación para formar una imagen. Para los controladores que no tienen su propia memoria, un recurso asignado desde la RAM puede ser direccionable a través de una tabla de traducción de direcciones (Tabla de traducción de gráficos, GTT). De lo contrario, la imagen solo se puede mostrar al copiar la superficie en la memoria de video, ya sea por medio del controlador DMA, si lo hay, o debido a los recursos de la CPU.

De hecho, incluso los controladores con su propia memoria discreta en la mayoría de los casos también lo abordan a través de GTT, ya que de esta manera es posible crear un espacio de dirección virtual por analogía con el procesador central TLB para proporcionar direccionamiento lineal o en mosaico. El método de direccionamiento en cada caso determina el controlador y no existe una diferencia fundamental entre ellos en el marco de este artículo.

Ejemplo de direccionamiento de mosaico en la memoria de video del artículo fuente
imagen

El controlador del controlador de gráficos es la interfaz del sistema operativo para la funcionalidad de la GPU, nada más. Todas las tareas para garantizar la protección de la información se asignan a cualquier nivel superior responsable de esto. Para esto, los controladores tienen toda la funcionalidad disponible, habría un deseo de usarlo.

Entonces, a solicitud de algún controlador de cliente, el sistema operativo reserva (asigna) un conjunto de superficies para ello. Dado que, según el autor, la fragmentación de la imagen es relativamente rara, podemos argumentar que el direccionamiento en mosaico no se usa con frecuencia en estos casos. Con el direccionamiento lineal, cada superficie se caracteriza principalmente por el desplazamiento desde el comienzo del espacio de direcciones virtuales de la memoria del controlador. Al asignar memoria, el controlador devuelve al sistema operativo exactamente este desplazamiento, que corresponde a un bloque de memoria libre que puede acomodar la superficie con las características solicitadas por el software de la aplicación. En este caso, el controlador realiza solo las siguientes acciones: modifica GTT para un mayor uso de páginas de memoria virtual, supervisa el cumplimiento de los requisitos para la alineación de direcciones físicas,define el mecanismo de acceso del software de aplicación a la superficie (apertura PCI / GPU, por dirección física fuera de la apertura, extensión GTT sobre la marcha), reserva una parte de la memoria para sus propias necesidades.

Con base en lo anterior, podemos concluir que, teniendo información sobre la cantidad total de memoria de controlador disponible y las características de superficie requeridas, la determinación de desplazamiento para todos los controladores puede resolverse de manera uniforme. En la práctica, este es el caso (guiado por la experiencia con varios sistemas operativos tipo UNIX): el sistema operativo proporciona un servicio / biblioteca del sistema que almacena una lista de bloques de memoria ya usados ​​y le permite calcular rápidamente el primer desplazamiento disponible para la copia de seguridad lógica dentro de esta biblioteca. Al mismo tiempo, al tener información del controlador sobre el mecanismo de acceso al bloque de memoria, el sistema operativo generalmente permite que el software de aplicación se forme en las mismas direcciones físicas de superficies compartidas / que se cruzan.

Si el controlador no controla explícitamente las superficies, ¿cómo se implementa la aceleración?
. - , , ( ), .

( ) , ( ), .




Volviendo al problema original.


Seguramente en este punto, muchos ya han adivinado a qué se reduce la crítica. Al ejecutar varias aplicaciones, el sistema operativo solicita la superficie del controlador de video para sus necesidades y las reutiliza a medida que la memoria se libera (finalización del proceso). Al mismo tiempo, el controlador no puede ser consciente de que algunos bloqueos de memoria requieren un reinicio inmediato, ya que tiene ciertos requisitos de seguridad y no tiene otros enlaces. Poner a cero la memoria en sí es una tarea trivial del hardware que llena un rectángulo.

De hecho, la prueba escrita para publicar el informe de error es redundante. En el caso general (cuando la memoria de video se ajusta a una apertura PCI / GPU), no se requieren API de aplicación para sistemas tipo UNIX. Es suficiente contactar / dev / mem usando el desplazamiento conocido de la salida de la utilidad "lspci".

Para los controladores Intel, la situación es diferente, pero no mucho. Como el controlador no tiene su propia memoria, GTT se forma sobre la marcha con la asignación de memoria desde la RAM. Al reasignar la superficie, es posible que no tenga suerte con la ubicación real del bloque RAM, dado que en este caso el mecanismo de direccionamiento virtual del sistema operativo ya juega un papel decisivo.

Hay varias soluciones, y creo que las conclusiones serán obvias:
  • Todos los fabricantes de controladores deben implementar una funcionalidad redundante para almacenar información sobre superficies existentes (la cuestión de controlar las superficies compartidas permanece abierta );
  • El sistema operativo debe monitorear la necesidad de que esta o aquella aplicación se ordene ( esto es una cierta marca de las superficies protegidas o una puesta a cero excesiva de cualquier superficie tanto en la RAM como en la memoria de video );
  • El software de la aplicación debe limpiarse correctamente después de sí mismo, ya que afirma estar involucrado en la seguridad de la información.

Espero que la nota haya sido interesante.

Source: https://habr.com/ru/post/es389039/


All Articles