¿Dónde está la ubicación del búfer de visualización en una placa de computadora? [cerrado]

En un texto de desarrollo del sistema operativo de Nick Blundel , en el capítulo 4.1 titulado Adaptación a la vida sin BIOS , se explica que mientras el hardware de gráficos está en modo de texto , podemos escribir caracteres ASCII en la pantalla escribiéndolos directamente en el búfer de visualización comenzando en la dirección 0xb8000.

Por lo tanto, puedo hacer algo como esto con el ensamblador NASM:

VIDEO_MEMORY equ 0x000b8000

mov edx, VIDEO_MEMORY

mov [edx], ax    ; "al" register already contains character itself
                 ; "ah" register already contains character attributes

Mi código ensamblador funciona bien, pero tengo una pregunta sobre la ubicación del búfer de visualización: ¿dónde está? ¿El búfer de visualización reside dentro de la RAM principal de la computadora o reside dentro de la memoria de la tarjeta gráfica?

Tal vez la siguiente imagen aclare mi duda:

ingrese la descripción de la imagen aquí

Dentro de la memoria de la tarjeta gráfica. Por cierto, solo puede escribir caracteres en la pantalla de esa manera con la tarjeta gráfica en un modo de texto adecuado. No menciona eso en su pregunta, vale la pena editarlo para decirlo para otros lectores.
0xb8000no es una verdad universal: es solo un conocimiento a priori de una computadora histórica específica, que ha sentado un precedente que muchas computadoras aún siguen. En las computadoras de esa época, ese rango de direcciones se habría asignado a la tarjeta gráfica. Hoy en día hay tantos niveles de hardware de traducción de direcciones entre la CPU y la memoria, y la emulación de software además de eso, que ya no es cierto, pero siempre que el sistema operativo (todavía comience con el BIOS en el arranque) configure estos niveles correctamente, puede programar como si todavía fuera cierto.
Brian tiene razón. Las computadoras viejas estaban limitadas a 20 bits de dirección. La vieja placa de video se mapeó en ese espacio de direcciones. El 80286 agregó 4 bits de dirección, pero salir del modo protegido requirió un reinicio de la CPU. Así que no hay cambios en el mapeo de direcciones de la placa. 80386 solucionó esto y permitió la reasignación del modo protegido. La memoria de la placa de video también estaba aumentando. Así que algunos fueron virtualmente reasignados a direcciones antiguas. Hoy en día, es aún más complejo, pero el código del controlador proporciona soporte heredado.
brian, jonk: estos comentarios son respuestas. ¿Publicarlos como tal, tal vez?
Suponiendo que lo ejecuta en algún cuadro de dos en un sistema operativo gráfico, escribe en el ram en algún lugar y el programa lo lee y algunos controladores lo procesan en ram de video como píxeles
@Marcus Mis respuestas siempre están escritas para tener una visión integral, o no me molesto. Algunos aquí simplemente escriben respuestas rápidas y discontinuas. Quiero contribuir cuando tiene valor más allá del OP solo. No vale la pena de otra manera para mí. Ya hay mucha basura en el mundo. Quiero una pequeña parte agregando más para avanzar. Necesitaría escribir más de lo que sé (y es mucho sobre este tema), pero ahora tengo muy poco tiempo. Brian puede tener los elogios.
@jonk, ¡tienes bastante ética de trabajo/contenido! mi respeto.
El problema es que estoy con @jonk. Ni siquiera quiero intentar enumerar las capas de abstracción entre el ensamblador del OP y el hardware moderno, me perdería algunas, se necesitaría un libro para hacerle justicia. (¡Tenga en cuenta que incluso el texto vinculado ejecuta todos sus ejercicios a través de un emulador SW!)
@jonk @BrianDrummond Gracias. No puedo entender el proceso de mapeo y las capas de abstracción involucradas y me molesta. Me pregunto si puedes presentar algunos buenos libros de texto. ¿Puedo hacer una pregunta más? En el procesador, cuando la instrucción mov [edx], axse ejecuta mientras edxes igual a 0x000b8000, ¿el procesador emplea el bus que va a la memoria principal, o emplea un bus de E/S que va a la tarjeta gráfica, o emplea un bus de E/S? ¿Cuál va a un chip de placa (como el puente norte) y luego va a la tarjeta gráfica? Lo siento si no es la pregunta más inteligente.
@ user4838962 mañana, puedo tener algo de tiempo para proporcionar suficientes pensamientos. He trabajado en tarjetas gráficas desde siempre, incluidos los cambios con pci y agp y la emulación en modo protegido para código heredado. El bus io es radicalmente diferente con la llegada de super io y PIC avanzado y multi cpu también. El puente sur para la compatibilidad con tarjetas antiguas ya casi no existe. Etc. Mucho por escribir. Habrá que editar mucho.
@jonk Impresionante, lo aprecio.
En el momento en movque ocurre la instrucción, es posible que los datos no pasen de la memoria caché L2, en el mismo dado que los núcleos de la CPU. Dependiendo de otros eventos y de cómo esté configurada la lógica de control de caché, algún tiempo después, le sucederá algo más. Pero felizmente le diferiré a @jonk sobre qué y cuándo.
Esta pregunta es demasiado amplia para responderla, porque se han utilizado todo tipo de soluciones en máquinas compatibles con PC: memoria de video dedicada y también tomar prestada parte de la memoria principal (incluido el ancho de banda para acceder a ella), por nombrar dos de las más obvias. Si está buscando un modelo en particular donde la tarjeta gráfica tiene RAM integrada, es probable que se use, al menos en los modos en los que sería suficiente.

Respuestas (2)

No tengo el tiempo o la inclinación para escribir un libro aquí sobre el tema de escribir su propio sistema operativo en los procesadores de la familia x86. No solo estamos en un día en el que el proceso de arranque en sí ha sufrido muchos cambios.

La mayor parte de lo que sigue es historia antigua. Entonces, si quieres, salta al final donde trato de responder directamente a tu pregunta.

Cualquiera que intente desarrollar algo desde cero, debe revisar los Manuales para desarrolladores de software de arquitectura de 64 y 32 bits . Tiene solo unas 5000 páginas. Entonces, ¿quizás un par de noches de lectura? Oh. Casi olvido. No olvide leer los cambios en la documentación de 64 y 32 bits . Son apenas 2000 páginas más. Si desea una descripción general de todo lo que probablemente necesite leer, está aquí: Comprensión de la documentación técnica para los procesadores Intel . (Ni siquiera quiero tratar de contar las páginas allí).

Es de gran ayuda si comienza a familiarizarse exactamente con lo que hace el procesador cuando sale del reinicio de encendido. (También hay un "restablecimiento en caliente", así que no se confunda demasiado todavía). Algunas cosas no se pueden cambiar sin un reinicio de encendido completo (algunas 'extensiones de modo más seguro' que se encuentran en IA32_FEATURE_CONTROL MSR, por ejemplo).

Todo el comportamiento de reinicio de encendido del procesador ha cambiado radicalmente a lo largo de los años. Es útil familiarizarse por completo con ese proceso si tiene la intención de escribir algo. ¡Más especialmente si planea reemplazar completamente el código del chip BIOS en la placa base!

Eso es suficiente para volver loco a cualquiera. Me vi obligado a leer este material, junto con una gran cantidad de documentación sobre PCI, AGP, puente sur, ya que estaba identificando errores en la interfaz PCI a ISA, aproximadamente el 50% de todos los errores de chipset de Intel en ese momento. Hay actualizaciones de especificaciones (algunas de estas pueden haberse vuelto "confidenciales", pero en el momento en que estaba trabajando en esto, Intel las publicó si sabía exactamente qué pedir). También tuve que ir a un centro seguro para "verificar out" otros libros que Intel NO publica.

Si planea depender solo de los comportamientos del código ROM existente, entonces necesita estudiar cómo es que una PC realmente se inicia a través de ese código. Y usted está muy por delante del juego ya que está permitiendo que otros configuren todo por usted.


La última vez que verifiqué, cuando una PC arranca (no UEIF), puede decidir si tiene o no un sistema operativo PnP (plug and play). Si dice "sí", entonces el BIOS no se molesta en configurar todos esos PCI. dispositivos (a excepción de la tarjeta de video y algunos otros absolutamente necesarios para comenzar). En cambio, los deja para que el sistema operativo se preocupe más adelante. Si dice que no tiene un sistema operativo PnP (y esto es lo que debe decir, si está escribiendo uno propio), entonces el BIOS saldrá y enumerará todos esos elegantes dispositivos PCI para usted y en el momento en que su el código comienza a ejecutarse, todos esos dispositivos PCI PnP ya estarán activos y listos para funcionar. Eso es bueno si recién está comenzando a escribir sistemas operativos por su cuenta.

El BIOS también hace muchas otras cosas por usted. Si hay varias CPU, se apagarán todas menos una. Las tarjetas de memoria se resolverán y asignarán correctamente para que formen una memoria contigua y se operen con la configuración de tiempo correcta (hay MUCHAS formas de configurar el conjunto de chips para la memoria, por lo que sin que el BIOS haga esto por usted, la situación predeterminada puede ser muy diferente.) Todo esto es parte de un montón de pasos secuenciales y si tiene una de esas elegantes pantallas de código BIOS, puede averiguar dónde está y en cualquier momento dado a medida que avanza.

Los primeros sistemas (no puedo hablar por los de hoy, ya que no los he probado) también permitían descargar código a través del conector del teclado. Entonces, el BIOS verificaría si había algo allí que quisiera ingresar código. Esto facilitó mucho la prueba de las placas base en la fabricación. Pero también era una característica de esas máquinas. ¿Hoy? No sé.


El "modo real" o el modo de 16 bits ya no existe. El último chip en implementarlo fue el 80286. Comenzando con el 80386, configuraron registros de sombra internos para "valores de reinicio de encendido predeterminados" que "emulaban" el modo anterior. Sin embargo, el procesador ya no tenía modo real, después del 80286. En cambio, a partir del 80386 siempre está en modo protegido. Es solo que puede configurar las cosas al reiniciar para que "parezca" como el modo real. Si quiere ser complicado con esto, puede ver que 21 (no 20) de las 36 líneas de dirección que salen del 80386 pueden verse afectadas por el código en modo real que se ejecuta en él. Esto se debe a que su llamado "modo real" en realidad era un modo protegido y los sumadores de direcciones aún podían generar ese bit de dirección 21. En los dispositivos más antiguos, eso no


Suponiendo que inicia en "modo real" y se está ejecutando como un inicio de 16 bits, entonces el BIOS ya habrá mapeado la tarjeta de video compleja de tal manera que sea "visible" en su espacio de direcciones. Las tarjetas más antiguas de solo texto ("monocromáticas") se ubicaron en el valor del segmento = 0xB000 y proporcionaron 32k bytes. El CGA comenzaba en 0xB800 (para evitar la tarjeta monocromática) y también tenía 32k bytes. Pero ahora podría proporcionar un byte de color junto con el byte de texto. El EGA luego recibió 0xA000 y tenía un tamaño de 64k. Eventualmente, las cosas se complicaron. Tenías el VGA, el PGA y... luego todo se desató y el tamaño de la memoria explotó y ya no podía "encajar" dentro del espacio de direcciones de 16 bits.

Entonces, las tarjetas más nuevas comenzaron permitiéndole "paginar" y "paginar" varios bancos de memoria. Pero muy pronto, estas placas solo podrían ser útiles si se estuviera ejecutando en modo protegido y tuviera fácil acceso a TODA su memoria TODO EL TIEMPO.

Hoy en día, el propio sistema operativo posee la pantalla por completo y la ejecuta en modo protegido. En la medida en que pueda estar ejecutando una "caja de DOS" dentro del sistema operativo, todo lo que hace es extender un área de memoria especial en el pequeño espacio de memoria asignado al código de la caja de DOS. Si escribe en esa memoria, esto a su vez provoca un evento de interrupción de modo protegido (tiene prohibido escribir en él, por lo que se produce una excepción) que interpreta la instrucción y descubre cómo emularla en el contexto actual. Lo mismo sucede con cualquier instrucción de E/S que intente realizar. Esos son todos emulados. También hay "trampas de instrucciones ilegales" que también fuerzan un evento de interrupción, pero que el controlador de eventos del modo protegido puede "ver".


Tal vez el primer paso que debe intentar es simplemente ponerse en marcha en modo protegido de 16 o 32 bits. Esto significa configurar IDT, GDT y LDT y forzar una recarga de los registros de sombra (a los que no puede acceder directamente, pero puede llenar siguiendo ciertos pasos). Luego, vea si aún puede hablar con la pantalla, pero ahora en modo protegido.


Tengo una pregunta sobre la ubicación del búfer de visualización: ¿dónde está? ¿El búfer de visualización reside dentro de la RAM principal de la computadora o reside dentro de la memoria de la tarjeta gráfica?

La memoria de la tarjeta de visualización está conectada al conjunto de chips a través de un bus especial llamado AGP, AGP Pro o AGP 64. (Y probablemente aún no me haya dado cuenta de algunos). El motivo de esta interfaz especial, en lugar de usar el PCI como solían hacer (o la ISA antes de eso), es que existen requisitos significativamente relajados para la transferencia de datos entre la CPU y la memoria gráfica. Por ejemplo, ¿a quién le importa si el píxel 4714 se escribe antes o después del píxel 1081? Con un sistema operativo y subprocesos que ejecutan código, ese tipo de orden puede ser importante. Pero con un procesador de gráficos que muestra una pantalla, realmente no importa tanto. Entonces, el conjunto de chips tiene más libertad sobre las transferencias de memoria y esto permite algunas reglas de aceleración en el conjunto de chips.

Si arranca en x86 "modo real falso", entonces parte de la memoria de la tarjeta de video se habrá mapeado en el espacio de dirección de 20 bits (+1, más o menos, si su segmento y compensación llega tan lejos) de su modo de 16 bits para acceso directo. La tarjeta de video también tendrá sus registros internos preconfigurados para que emule una de las tarjetas antiguas y no se dispare usando toda esa memoria extra disponible cuando dibuja una pantalla. (Y las frecuencias de actualización y otras cosas están configuradas adecuadamente por el código que reside en la tarjeta de video como lo invoca el BIOS antes de que comience su código).

Entonces, en realidad está escribiendo en la memoria directamente, si está ejecutando un código que se inició directamente para ejecutarse en modo real. Sin embargo, solo se introduce la punta del iceberg de la memoria de video en su espacio de direcciones.

Si, por otro lado, está ejecutando un código de ensamblaje similar debajo de un sistema operativo en una caja de DOS de algún tipo, entonces NO está escribiendo en la memoria de video, en absoluto. Todo lo que está haciendo es causar un evento de interrupción que invoca un software que regresa a su espacio de memoria, lee la instrucción y mira los registros allí, y luego emula su instrucción antes de regresar.

Entonces... depende.


Solía ​​​​poder recoger sistemas PC/104 con chipsets que aún admitían el antiguo bus ISA. No he comprobado en los, recientemente. Pero el grado de compatibilidad con los antiguos modos ISA de 8 bits/16 bits dependerá en gran medida de si alguien todavía fabrica y admite los conjuntos de chips necesarios. No creo que nadie haga lo que hizo el Kaypro 286i, utilizando todas las piezas discretas de la serie 7400 en la placa base antes de que C&T fabricara sus conjuntos de chips para ayudar a desacoplar la velocidad del bus de la velocidad de la CPU. Esos son muchos chips SSI para hacer que eso funcione y prácticamente nadie se va a molestar hoy en día. Entonces, si ya no existe un equivalente de puente sur, entonces los fabricantes de PC/104 habrán tenido que seguir adelante y dejar atrás el antiguo bus ISA de alguna manera.

(Mi apuesta es que no pudieron seguir adelante, sino que desarrollaron algún tipo de placa adicional en lugar de incluir la funcionalidad en la placa principal de la CPU. Si es así, me pregunto si ahora admiten modos de 8 bits o si es solo transferencias en modo de 16 bits hoy. También me pregunto especialmente si todavía son compatibles con DMA, ya que la interfaz DMA/PCI fue lo más difícil de hacer [DMA requería una sincronización de precisión que NO se podía pausar y PCI solo admite modos de ráfaga y DEBE detenerse periódicamente y luego reiniciarse.] Si estuviera apostando, apostaría que ISA DMA ya no es compatible o cuesta mucho dinero obtenerlo).

Tal vez en el Pleistoceno, en los albores de las computadoras personales, su truco podría funcionar la mayor parte del tiempo.

Hoy en día, la memoria gráfica se encuentra en la tarjeta gráfica o está estrechamente acoplada al chip gráfico. Probablemente se pueda mapear en la memoria, pero no antes de algunas configuraciones, y ciertamente no en una dirección fija como B8000h.

Recuerdo vagamente que las primeras PC mapeaban en la memoria un búfer de texto que el hardware de gráficos mostraba en modo teletipo de vidrio , y eso podría haber sido en B8000h. Ese fue el encendido predeterminado para que los mensajes de estado y diagnóstico pudieran mostrarse al usuario desde muy temprano en el proceso de arranque. Eventualmente, después de que se cargara lo suficiente del sistema operativo, se haría cargo de la administración de la memoria, cambiaría el subsistema de gráficos al modo de gráficos de mapa de bits y la pantalla se manejaría de manera muy diferente.

Quizás algunas arquitecturas hoy en día siguen siendo compatibles con el antiguo modo de encendido. Sin embargo, ha habido mucha evolución de la bios desde entonces, y las aplicaciones cargadas por la bios ya no dependen de direcciones asignadas de memoria fija. Entonces, en alguna máquina hoy, tal vez , puede usar el sistema de gráficos como lo describe si de alguna manera puede llegar a la máquina antes de que se ejecute el BIOS.

Para hacer esto, básicamente necesitaría crear su propia "bios". Realmente no necesitaría ser una BIOS ya que no es compatible con la siguiente capa de aplicación. Realmente sería su propio programa muy primitivo que se ejecuta en el hardware de la PC inmediatamente después del encendido o reinicio físico. Por supuesto, entonces no tiene ningún tipo de servicio de sistema operativo disponible, ni siquiera los primitivos proporcionados por el BIOS para permitir que un sistema operativo moderno se inicie solo.

Yo era una pequeña parte del equipo Phoenix BIOS durante el tiempo en que pci comenzó y ppro y p ii eran productos activos en Intel. Yo era la interfaz de Intel, ya que entonces poseían la mitad de Phoenix. Hay tantos detalles de la historia aquí. Con el sistema operativo moderno (muy diferente hoy que cuando el soporte era mucho mejor en Win2000 y disminuyó gradualmente a mínimos con el tiempo), se emula totalmente a través de interrupciones a través de hasta 64 capas a controladores especiales diseñados para falsificar cosas. Lento, pero semi funciona para algunas cosas mínimas. Gran parte de la emulación se pierde y ya no es compatible.
Los firmwares de PC modernos (que ya no son realmente un "BIOS") aún brindan las interrupciones de BIOS heredadas y configuran todas esas asignaciones de memoria para compatibilidad con los cargadores de arranque heredados (aunque las rutinas de servicio de BIOS pueden tener algunos errores a veces). Solo los firmwares UEFI puros abandonaron este soporte.
Bastante seguro de que hoy quedan implementaciones económicas de hardware compatible con PC que toman prestada parte de la capacidad y el ancho de banda de los dispositivos de memoria del sistema principal para el búfer de cuadros.
Este truco funciona en computadoras modernas que simulan computadoras más antiguas, y todavía lo hacen (la última vez que lo comprobé). Pero solo si no está utilizando un sistema operativo más avanzado que DOS.