graphics - essential - titles pack premiere pro templates
¿Dónde está el búfer de video del modo de texto si no está en 0xB8000? (3)
Hace unos 15 años, solía divertirme y molestar a mi profesor de CS escribiendo un código incorrecto que modificaría directamente el texto en el monitor. Esto fue / es fácil de hacer accediendo a la memoria de video en 0xB8000 en PC compatibles con VGA.
Un avance rápido hasta hoy, decidí probar mi viejo truco a través de un puerto de depuración que me da acceso para leer la memoria física. Para mi gratificación, todavía funcionaba en la primera plataforma en la que lo probé. Luego, desalentadoramente, descubrí que no funciona en muchos otros sistemas. Parece que los sistemas en los que no funciona tienen gráficos UMA (memoria compartida).
Entonces, una pregunta para todos los escritores de BIOS, chicos de SO de bajo nivel y gurús de controladores de video: si estoy en un modo de texto a color de 80x25 en un sistema compatible con PC con memoria de gráficos compartida, en modo real, y el contenido de 0xb8000 - 0xB8FFF son todos 0xFF en lugar de darme lo que hay en la pantalla, ¿a dónde fue el buffer de la pantalla?
Ah, si es una pantalla del BIOS, entonces todas las apuestas están apagadas. El hecho de que sea un BIOS en una placa base con gráficos integrados inclina las cosas aún más a favor de la extrañeza del video.
En toda probabilidad, la funcionalidad VGA "clásica" está emulada en todos los sentidos. Con una tarjeta de video externa esto sería invisible para el BIOS, todavía ve una tarjeta de video VGA. Pero un BIOS cableado a la tarjeta de video no necesitaría instalar la capa VGA falsa y el mapeo de la memoria del espacio de direcciones de 20 bits de la vieja escuela solo para pegar texto en la pantalla.
En su lugar, el BIOS puede interactuar directamente con la tarjeta (a través de un modo propietario) hasta que el sistema operativo realmente se inicie, momento en el que realiza el mapeo de la memoria. Esto tiene una ventaja importante en que para una tarjeta que comparte memoria principal, no se obtiene una pantalla en blanco al iniciarse si la RAM está instalada incorrectamente (en cambio, el modo de BIOS apropiado para las tarjetas de video podría usar un buffer normalmente reservado para otro propósito, permitiéndole ingresar al BIOS y ver 0MB de RAM instalada)
Las tarjetas CGA (Color Graphics Adapter) y MDA (Monochrome Display Adapter) utilizan regiones diferentes. Uno (color) está en 0xB8000 ; pero monocromo comienza en 0xB0000 . Recuerde, puede tener ambas pantallas activas en la máquina a la vez.
Vea el Mapa de memoria de DOS (aunque tiene un error tipográfico en el desplazamiento para CGA , debería ser 8000 h no 0800 h).
En cuanto a VGA (Video Graphics Array), su memoria comienza a bajar, en el límite de 640K a 0xA0000 y continúa para 64K, pero puede ir más allá, ya que la tarjeta podría tener hasta 256K. Algunos ejemplos de código para programar VGA están aquí . Pero no es tan simple ya que tiene múltiples modos de video. Puede intentar aquí para obtener ayuda.
¿Estás seguro de que tienes VGA, y no EGA o XGA o Super-VGA? Todos ellos tienen una semántica ligeramente diferente ... Pero aún así, estoy bastante seguro de que cualquiera de ellos debe poner texto en 0xB0000 o 0xB8000 . Qué sucede cuando escribes
MODE MONO
o
MODO CO80
- ¿Eso afecta la pantalla? Esos cambiarían de un modo de texto de adaptador a otro, en DOS.
Puede ser que la memoria virtual esté habilitada en ese punto.
Por ejemplo, estaba intentando escribir en el búfer de video en la base de código iPXE y no se reflejó en la pantalla. Después de investigar, me di cuenta de que necesitaba llamar a la función:
phys_to_virt(0xB8000);
para poder escribir en el búfer de video directamente.