Cómo funciona (Gnu/Linux + X11)
Resumen
Se parece a esto (no se dibuja a escala)
┌───────────────────────────────────────────────┐
│ User │
│ ┌─────────────────────────────────────────┤
│ │ Application │
│ │ ┌──────────┬─────┬─────┬─────┤
│ │ │ ... │ SDL │ GTK │ QT │
│ │ ├──────────┴─────┴─────┴─────┤
│ │ │ xLib │
│ │ ├────────────────────────────┤
├─────┴───┬────────┴──┐ X11 │
│ Gnu │ Libraries │ Server │
│ Tools │ │ │
├─────────┘ │ │
├─────────────────────┤ │
│ Linux (kernel) │ │
├─────────────────────┴─────────────────────────┤
│ Hardware │
└───────────────────────────────────────────────┘
Vemos en el diagrama que X11 habla principalmente con el hardware. Sin embargo, necesita comunicarse a través del núcleo para obtener acceso inicialmente a este hardware.
Estoy un poco confuso con los detalles (y creo que cambió desde la última vez que lo miré). Hay un dispositivo /dev/mem
eso da acceso a toda la memoria (creo que la memoria física), como la mayoría del hardware de gráficos está mapeado en la memoria, este archivo (ver todo es un archivo) se puede usar para acceder a él. X11 abriría el archivo (el kernel usa permisos de archivo para ver si puede hacer esto), luego X11 usa mmap
para asignar el archivo a la memoria virtual (hacer que parezca memoria), ahora la memoria parece memoria. Después de mmap
, el núcleo no está involucrado.
X11 necesita conocer los diversos hardware de gráficos, ya que accede a ellos directamente, a través de la memoria.
(esto puede tener cambios, específicamente el modelo de seguridad, puede que ya no dé acceso a TODO de la memoria.)
Linux
En la parte inferior está Linux (el kernel):una pequeña parte del sistema. Proporciona acceso al hardware e implementa seguridad.
Gnu
Luego Gnu (Bibliotecas; bash; herramientas:ls, etc; compilador C, etc.). La mayor parte del sistema operativo.
Servidor X11 (por ejemplo, x.org)
Luego X11 (O Wayland, o ...), el subsistema GUI base. Esto se ejecuta en la tierra del usuario (fuera del kernel):es solo otro proceso, con algunos privilegios. El kernel no se involucra, excepto para dar acceso al hardware. Y proporcionando comunicación entre procesos, para que otros procesos puedan hablar con el servidor X11.
Biblioteca X11
Una abstracción simple que le permite escribir código para X11.
Bibliotecas GUI
Bibliotecas como qt, gtk, sdl son las siguientes:facilitan el uso de X11 y funcionan en otros sistemas como wayland, Windows de Microsoft o MacOS.
Aplicaciones
Las aplicaciones se encuentran encima de las bibliotecas.
Algunos puntos de entrada de bajo nivel, para programación
xlib
Usar xlib es una buena manera de aprender sobre X11. Sin embargo, primero lea un poco sobre X11.
SDL
SDL le dará acceso de bajo nivel, directo a planos de bits para que dibuje directamente.
Yendo más bajo
Si quiere ir más bajo, entonces no estoy seguro de cuáles son las buenas opciones actuales, pero aquí hay algunas ideas.
- Consigue un viejo Amiga o un simulador. Y una buena documentación. p.ej. https://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up (Tenía 2 libros, este y similares).
- Mira lo que se puede hacer en una raspberry pi. No he investigado esto.
Enlaces
X11
https://en.wikipedia.org/wiki/X_Window_System
Formas modernas
Escribir esto me interesó, así que eché un vistazo a cuál es la forma moderna y rápida de hacerlo. Aquí hay algunos enlaces:
https://blogs.igalia.com/itoral/2014/07/29/una-breve-introduccion-a-la-pila-de-graficos-de-linux/
La respuesta de ctrl-alt-delor le brinda una buena descripción general de la arquitectura general. Para un enfoque más práctico, le doy una respuesta sobre "nada más que el kernel de Linux y la programación en C".
Me gusta escribir en el frame-buffer directamente de vez en cuando. El controlador del dispositivo frame-buffer hará todas las tediosas cosas cercanas al hardware "¿cómo terminará esto finalmente en una pantalla?" por usted. Puede hacerlo de inmediato con un shell raíz:
echo -n -e '\x00\x00\xFF' > /dev/fb0
Establece el primer píxel (arriba a la izquierda) en rojo en mi búfer de cuadros de 32 bits:
Puede hacerlo totalmente desde C abriendo /dev/fb0 y escribiendo bytes. El mapeo de memoria puede convertirse en tu amigo. Esto solo funciona sin un servidor X o en una consola virtual. Presione Ctrl+Alt+F1 para acceder.
PD:Visualizar datos aleatorios como el movimiento del mouse también puede ser divertido:
cat /dev/input/mouse0 > /dev/fb0
PPS:también tenga en cuenta que prácticamente cualquier aplicación de escritorio del mundo real necesita un acceso más directo al hardware para algunas cosas sofisticadas como la aceleración de hardware para dibujo, 3D y renderizado de video. El simple dispositivo frame-buffer no hará nada de esto bien.
Recomiendo encarecidamente comenzar con ncurses.
A diferencia de los sistemas gráficos más complejos, se basa únicamente en texto, por lo que no hay necesidad de atascarse en los detalles de los controladores de pantalla y las bibliotecas de gráficos. Sin embargo, los principios básicos de colocar ventanas en una pantalla, mover el foco entre ventanas, etc., siguen siendo válidos. Y todavía puedes hacer algo de dibujo, a nivel de bloques de un solo carácter y arte ASCII.
Por supuesto, todavía está construyendo esto sobre una biblioteca, pero es una biblioteca que puede entender fácilmente. Y más que eso, es una biblioteca donde el código fuente está disponible gratuitamente, bastante bien documentado y no demasiado impenetrable si desea leerlo. Incluso puedes modificarlo tú mismo si quieres. O puede mirar todas las funciones de la biblioteca para encontrar lo que debe ser la API y escribirla usted mismo desde cero en función de ese diseño.