¿Qué sucede realmente en el hardware de PC moderno que se '1'
inicia en el modo MBR heredado de 16 bits cuando almacena un byte como (0x31) en el framebuffer de texto VGA (modo 03) en una dirección lineal física B8000
? ¿Qué tan lenta es una mov [es:di], eax
tienda con el MTRR para esa región establecida en UC? ( Las pruebas experimentales en una computadora portátil Kaby Lake iGPU indican que clflushopt en WC era aproximadamente la misma velocidad que UC para la memoria VGA. Pero sin clflushopt, las mov
tiendas en la memoria WC nunca abandonan la CPU y no actualizan la pantalla en absoluto, corriendo súper rápido .)
Si no es un SMI para cada tienda, ¿hay alguna forma de aproximar este costo en una porción de memoria WB en el espacio del usuario, para experimentos de rendimiento sin reiniciar en modo real? (por ejemplo, usando una página BSS como un framebuffer de simulación que en realidad no se muestra en ningún lado).
El glifo de fuente correspondiente aparece en la pantalla en la próxima actualización, pero ¿el escaneo de hardware realmente lee ese carácter ASCII de VRAM (o DRAM para una iGPU) y se asigna a los glifos de fuente de mapa de bits sobre la marcha? ¿O hay alguna intercepción de software en cada tienda o una vez por vblank para que el hardware real solo tenga que manejar un framebuffer de mapa de bits?
El arranque de BIOS heredado es bien conocido por usar el modo de administración del sistema (SMM) para emular el kbd / mouse USB como dispositivos PS / 2. Me pregunto si también se usa para el framebuffer de modo de texto VGA. Supongo que se usa para los puertos de E / S VGA para la configuración de modo, pero es posible que el hardware admita un buffer de cuadros de texto. Sin embargo, la mayoría de las computadoras pasan todo su tiempo en modo gráfico, por lo que dejar de lado el soporte HW para el modo de texto parece algo que los proveedores podrían querer hacer. (OTOH este blog sugiere que un controlador VGA verilog homebrew puede implementar el modo de texto de manera bastante simple).
Estoy específicamente interesado en los sistemas que usan iGPU en Intel Skylake, pero estaría interesado en iGPU anteriores / posteriores de Intel y AMD, y GPU discretas nuevas o antiguas.
(Incluidos los proveedores que no sean AMD y NVidia; hay algunas placas base Skylake con ranuras PCI, no PCIe. Si los controladores de firmware de GPU modernos emulan el modo de texto, presumiblemente hay algunas viejas tarjetas de video PCI con modo de texto VGA de hardware. Y tal vez una tarjeta de este tipo podría hacer que las tiendas sean solo una transacción PCI en lugar de una SMI).
Mi propio escritorio es un i7-6700k en un Asus Z170 Pro Gaming mobo, no hay tarjetas adicionales solo iGPU con un monitor de 1920x1200 en la salida DVI-D. No conozco los detalles del sistema Kaby Lake i5-7300HQ que @Eldan está probando, solo el modelo de CPU.
Encontré la patente US20120159520 de Phoenix BIOS de 2011 ,
emulando video heredado usando uefi . En lugar de exigir a los proveedores de hardware de video que suministren controladores ROM de opción de modo real de UEFI y de 16 bits en modo real, proponen un controlador VGA en modo real ( int 10h
funciones, etc.) que llama a un controlador de video UEFI suministrado por el proveedor a través de enlaces SMM.
Resumen
La ROM de opción de video genérico notifica a un controlador SMM de video genérico de la solicitud de servicios de video. Dicha notificación puede realizarse utilizando una interrupción de gestión del sistema de software (SMI). Tras la notificación, el controlador SMM de video genérico notifica a un controlador de video UEFI de terceros sobre la solicitud de servicios de video. El controlador de video de terceros proporciona los servicios de video solicitados al sistema operativo. De esta forma, un controlador de gráficos UEFI de un tercero puede admitir una amplia variedad de sistemas operativos, incluso aquellos que no admiten de forma nativa los protocolos de visualización UEFI.
Gran parte de la descripción cubre el manejo de int 10h
llamadas y cosas por el estilo que obviamente atrapan a través de la IVT, por lo que pueden ejecutar fácilmente código personalizado que desencadena un SMI a propósito. La parte relevante es lo que describen para las tiendas directas en el framebuffer en modo de texto que deben funcionar incluso para el código que no desencadena ninguna interrupción de software o hardware. (Aparte de que HW desencadena SMI en tales tiendas, que dicen que pueden usar si son compatibles).
Soporte de buffer de texto
En ciertas realizaciones, las aplicaciones pueden manipular el búfer de texto del VGA directamente . En tal realización, el controlador de video SMM genérico 130 admite esto de una de dos maneras, dependiendo de si el hardware proporciona captura SMI en el acceso de lectura / escritura a la región de memoria de 740 KB-768 KB (donde se encuentran las memorias intermedias de texto).
[0067] Cuando la captura SMI está disponible, el hardware genera una SMI en cada acceso de lectura o escritura. Usando la dirección de la trampa SMI, se puede calcular la columna y fila de texto exacto y acceder a la fila y columna correspondientes en la pantalla de texto virtual.
Alternativamente, se habilita la memoria normal para esta región y, utilizando un SMI periódico, el controlador genérico de video SMM 130 busca cambios en el búfer de texto de hardware emulado y actualiza la pantalla de texto virtual correspondiente mantenida por el controlador de video. En ambos casos, cuando se detecta un cambio, el personaje se vuelve a dibujar en la pantalla de texto virtual.
Esta es solo la patente de un proveedor de BIOS, y no nos dice de qué manera funciona la mayoría del hardware, o si otros proveedores hacen cosas diferentes. Sin embargo, esencialmente confirma que existe algo de hardware que puede atrapar en tiendas en ese rango. (A menos que sea solo una posibilidad hipotética que decidieron cubrir en su patente).
Para el caso de uso que tengo en mente, atrapar solo en la actualización de la pantalla sería mucho más rápido que atrapar en todas las tiendas, así que tengo curiosidad por saber qué hardware / firmware funciona de esa manera.
Motivación para esta pregunta.
Optimización de un contador decimal ASCII incremental en RAM de video en Intel Core de séptima generación , almacenando repetidamente nuevos dígitos para un contador de texto ASCII en los mismos pocos bytes de RAM de video.
Probé una versión del código en el espacio de usuario de 32 bits en Linux, en la memoria WB, con la esperanza de aproximarme a la situación movnti
y a las diferentes formas de hacer que la CPU sincronice su búfer WC con la RAM de video después de cada tienda (o quizás ocasionalmente en una interrupción del temporizador). Pero esto no es realista si la situación del cargador de arranque en modo real no solo se almacena en DRAM, sino que desencadena un SMI.
En la memoria WB, el vaciado de movnti
tiendas con a lock xor byte [esp], 0
es algo más rápido que el vaciado con clflushopt
. Pero @Eldan no informa ninguna mejora de velocidad para aquellos en la memoria VGA después de programar un MTRR para que sea WC. (Y la misma velocidad que para el original haciendo almacenamientos normales, lo que indica que, de manera predeterminada, el framebuffer VGA era UC. Algunos BIOS más antiguos tenían la opción de crear WC de memoria VGA , que llamaron USWC = Combinación de escritura especulativa no almacenada en caché).
No es un problema del mundo real, por lo que no estoy buscando soluciones reales ; aunque sería interesante saber si almacenar manualmente bytes de píxeles en un modo de gráficos VGA podría ser mucho más rápido.
Resumen
- ¿Alguno / todos los sistemas modernos reales disparan un SMI en cada tienda al framebuffer en modo texto?
- Si no, ¿podemos aproximar una tienda WC + clflush al framebuffer, usando un movnti + algo en el espacio del usuario en la memoria WB? Por lo tanto, podemos perfilar fácilmente
perf
para contadores de rendimiento. - Si diferentes BIOS y / o hardware usan diferentes estrategias, ¿cuáles son esas estrategias? (No quiero detalles, solo un alto nivel como "SMI cada vblank para sincronizar el framebuffer VGA con el framebuffer de hardware real")
- ¿Sería una tarjeta de video PCIe o PCI con modo de texto VGA de hardware más rápido que cualquier GPU integrada? Supongo que una transacción de escritura PCIe real sería más lenta que esperar que una tienda llegue a DRAM, pero que una escritura PCIe sería más barata que una SMI en cada tienda. Una comparación de estadio de béisbol / orden de magnitud sería interesante.
Todas estas preguntas están muy relacionadas, pero puedo dividir esto si no hay tanta superposición como esperaba.
perf
porque Linux aún no se ha iniciado. La evaluación de la latencia SMI (interrupción de la administración del sistema) en la máquina Linux-CentOS / Intel tiene algunos detalles sobre cómo puede contar las SMI.
MSR_SMI_COUNT=0x34
sin tener que programar primero un contador.