Come funziona (Gnu/Linux + X11)
Panoramica
Assomiglia a questo (non disegna in scala)
┌───────────────────────────────────────────────┐
│ User │
│ ┌─────────────────────────────────────────┤
│ │ Application │
│ │ ┌──────────┬─────┬─────┬─────┤
│ │ │ ... │ SDL │ GTK │ QT │
│ │ ├──────────┴─────┴─────┴─────┤
│ │ │ xLib │
│ │ ├────────────────────────────┤
├─────┴───┬────────┴──┐ X11 │
│ Gnu │ Libraries │ Server │
│ Tools │ │ │
├─────────┘ │ │
├─────────────────────┤ │
│ Linux (kernel) │ │
├─────────────────────┴─────────────────────────┤
│ Hardware │
└───────────────────────────────────────────────┘
Vediamo dal diagramma che X11 dialoga principalmente con l'hardware. Tuttavia ha bisogno di comunicare tramite il kernel, per ottenere inizialmente l'accesso a questo hardware.
Sono un po' vago sui dettagli (e penso che sia cambiato dall'ultima volta che ci ho guardato dentro). C'è un dispositivo /dev/mem
che dà accesso a tutta la memoria (penso alla memoria fisica), poiché la maggior parte dell'hardware grafico è mappato in memoria, questo file (vedi tutto è un file) può essere utilizzato per accedervi. X11 aprirà il file (il kernel usa i permessi dei file per vedere se può farlo), quindi X11 usa mmap
per mappare il file nella memoria virtuale (farlo sembrare memoria), ora la memoria sembra memoria. Dopo mmap
, il kernel non è coinvolto.
X11 ha bisogno di conoscere i vari hardware grafici, in quanto vi accede direttamente, tramite la memoria.
(questo potrebbe subire modifiche, in particolare il modello di sicurezza, potrebbe non consentire più l'accesso a TUTTI della memoria.)
Linux
In fondo c'è Linux (il kernel):una piccola parte del sistema. Fornisce l'accesso all'hardware e implementa la sicurezza.
Gnu
Quindi Gnu (Librerie; bash; strumenti:ls, ecc; compilatore C, ecc.). La maggior parte del sistema operativo.
Server X11 (ad es. x.org)
Quindi X11 (o Wayland, o ...), il sottosistema GUI di base. Questo funziona in user-land (fuori dal kernel):è solo un altro processo, con alcuni privilegi. Il kernel non viene coinvolto, se non per dare accesso all'hardware. E fornendo comunicazione tra processi, in modo che altri processi possano comunicare con il server X11.
Libreria X11
Una semplice astrazione per permetterti di scrivere codice per X11.
Librerie GUI
Librerie come qt, gtk, sdl sono le prossime:semplificano l'uso di X11 e funzionano su altri sistemi come Wayland, Windows di Microsoft o MacOS.
Applicazioni
Le applicazioni si trovano in cima alle librerie.
Alcuni punti di ingresso di basso livello, per la programmazione
xlib
Usare xlib è un buon modo per conoscere X11. Tuttavia, prima leggi qualcosa su X11.
SDL
SDL ti darà un accesso di basso livello, diretto ai bit-plane su cui disegnare direttamente.
Scendendo
Se vuoi scendere, allora non sono sicuro di quali siano le buone opzioni attuali, ma ecco alcune idee.
- Prendi un vecchio Amiga, o simulatore. E una buona documentazione. per esempio. https://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up (avevo 2 libri, questo e simili).
- Guarda cosa si può fare su un Raspberry Pi. Non ho esaminato questo.
Collegamenti
X11
https://en.wikipedia.org/wiki/X_Window_System
Modi moderni
Scrivere questo ha suscitato il mio interesse, quindi ho dato un'occhiata a qual è il modo moderno e veloce per farlo. Ecco alcuni link:
https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/
La risposta di ctrl-alt-delor ti offre una buona panoramica dell'architettura generale. Per un approccio più pratico, ti do una risposta su "nient'altro che il kernel Linux e la programmazione in C".
Mi piace scrivere direttamente sul frame-buffer di tanto in tanto. Il driver del dispositivo frame-buffer farà tutte le noiose cose vicine all'hardware "come finirà questo alla fine su uno schermo" per te. Puoi farlo subito con una root shell:
echo -n -e '\x00\x00\xFF' > /dev/fb0
Imposta il primo pixel (in alto a sinistra) in rosso sul mio framebuffer a 32 bit:
Puoi farlo totalmente dall'interno di C aprendo /dev/fb0 e scrivendo byte. La mappatura della memoria può diventare tua amica. Funziona solo senza un server X o in una console virtuale. Premi Ctrl+Alt+F1 per accedervi.
PS:anche visualizzare dati casuali come il movimento del mouse può essere divertente:
cat /dev/input/mouse0 > /dev/fb0
PPS:Si noti inoltre che praticamente qualsiasi applicazione desktop del mondo reale richiede un accesso più diretto all'hardware per alcune cose fantasiose come l'accelerazione hardware per il disegno, il rendering 3D e video. Il semplice dispositivo frame-buffer non funzionerà bene.
Consiglio vivamente di iniziare con ncurses.
A differenza dei sistemi grafici più complessi, si basa esclusivamente sul testo, quindi non c'è bisogno di impantanarsi nei dettagli dei driver dello schermo e delle librerie grafiche. Tuttavia, i principi di base di mettere le finestre su uno schermo, spostare il focus tra le finestre e così via, sono ancora validi. E puoi ancora fare qualche disegno, a livello di blocchi di caratteri singoli e arte ASCII.
Ovviamente lo stai ancora costruendo sopra una libreria, ma è una libreria che puoi capire facilmente. E soprattutto, è una libreria in cui il codice sorgente è disponibile gratuitamente, abbastanza ben documentato e non troppo impenetrabile se vuoi leggerlo. Puoi anche modificarlo da solo se lo desideri. Oppure potresti guardare tutte le funzioni della libreria lì dentro per trovare ciò che l'API deve essere e scriverla tu stesso da zero sulla base di quel design.