GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie funktioniert eine Linux-GUI auf der untersten Ebene?

Wie es funktioniert (Gnu/Linux + X11)

Übersicht

Es sieht ungefähr so ​​aus (nicht maßstabsgetreu)

┌───────────────────────────────────────────────┐
│                       User                    │
│     ┌─────────────────────────────────────────┤
│     │             Application                 │
│     │            ┌──────────┬─────┬─────┬─────┤
│     │            │      ... │ SDL │ GTK │ QT  │
│     │            ├──────────┴─────┴─────┴─────┤
│     │            │            xLib            │
│     │            ├────────────────────────────┤
├─────┴───┬────────┴──┐         X11             │
│   Gnu   │ Libraries │        Server           │
│   Tools │           │                         │
├─────────┘           │                         │ 
├─────────────────────┤                         │
│   Linux (kernel)    │                         │
├─────────────────────┴─────────────────────────┤
│                    Hardware                   │
└───────────────────────────────────────────────┘

Wir sehen aus dem Diagramm, dass X11 hauptsächlich mit der Hardware spricht. Es muss jedoch über den Kernel kommunizieren, um zunächst Zugriff auf diese Hardware zu erhalten.

Ich bin ein bisschen verschwommen in Bezug auf die Details (und ich denke, es hat sich geändert, seit ich mich das letzte Mal damit befasst habe). Es gibt ein Gerät /dev/mem Das gibt Zugriff auf den gesamten Speicher (ich denke, physischer Speicher), da die meiste Grafikhardware speicherzugeordnet ist, kann diese Datei (siehe alles ist eine Datei) verwendet werden, um darauf zuzugreifen. X11 würde die Datei öffnen (der Kernel verwendet Dateiberechtigungen, um zu sehen, ob er dies tun kann), dann verwendet X11 mmap Um die Datei in den virtuellen Speicher abzubilden (sie wie Speicher aussehen zu lassen), sieht der Speicher jetzt wie Speicher aus. Nach mmap , der Kernel ist nicht beteiligt.

X11 muss über die verschiedene Grafikhardware Bescheid wissen, da es direkt über den Speicher darauf zugreift.

(Dies kann Änderungen aufweisen, insbesondere das Sicherheitsmodell, das möglicherweise keinen Zugriff mehr auf ALLE gewährt der Erinnerung.)

Linux

Ganz unten ist Linux (der Kernel):ein kleiner Teil des Systems. Es bietet Zugriff auf Hardware und implementiert Sicherheit.

Gnu

Dann Gnu (Bibliotheken; bash; tools:ls usw.; C-Compiler usw.). Der größte Teil des Betriebssystems.

X11-Server (z. B. x.org)

Dann X11 (oder Wayland oder ...), das Basis-GUI-Subsystem. Dies läuft im Benutzerland (außerhalb des Kernels):Es ist nur ein weiterer Prozess mit einigen Privilegien. Der Kernel mischt sich nicht ein, außer um Zugriff auf die Hardware zu gewähren. Und Bereitstellung von Interprozesskommunikation, damit andere Prozesse mit dem X11-Server kommunizieren können.

X11-Bibliothek

Eine einfache Abstraktion, mit der Sie Code für X11 schreiben können.

GUI-Bibliotheken

Bibliotheken wie qt, gtk, sdl sind die nächsten – sie erleichtern die Verwendung von X11 und die Arbeit auf anderen Systemen wie Wayland, Microsofts Windows oder MacOS.

Anwendungen

Anwendungen sitzen über den Bibliotheken.

Einige Low-Level-Einstiegspunkte für die Programmierung

xlib

Die Verwendung von xlib ist eine gute Möglichkeit, etwas über X11 zu lernen. Lesen Sie jedoch zuerst etwas über X11.

SDL

SDL bietet Ihnen Low-Level-Zugriff direkt auf Bitplanes, auf die Sie direkt zeichnen können.

Nach unten gehen

Wenn Sie tiefer gehen möchten, bin ich mir nicht sicher, welche guten aktuellen Optionen es gibt, aber hier sind einige Ideen.

  • Besorgen Sie sich einen alten Amiga oder Simulator. Und eine gute Dokumentation. z.B. https://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up (Ich hatte 2 Bücher, dieses und ähnliche).
  • Sehen Sie sich an, was auf einem Himbeer-Pi gemacht werden kann. Ich habe mich damit nicht befasst.

Links

X11

https://en.wikipedia.org/wiki/X_Window_System

Moderne Wege

Das zu schreiben, hat mein Interesse geweckt, also habe ich mir angesehen, was der moderne schnelle Weg ist, dies zu tun. Hier sind einige Links:

https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/


Die Antwort von ctrl-alt-delor gibt Ihnen einen guten Überblick über die allgemeine Architektur. Für einen praktischeren Ansatz gebe ich Ihnen eine Antwort zu "nichts als dem Linux-Kernel und der Programmierung in C".

Ich mag es, ab und zu direkt in den Framebuffer zu schreiben. Der Frame-Buffer-Gerätetreiber erledigt all die mühsamen hardwarenahen "Wie wird das schließlich auf einem Bildschirm landen"-Zeug für Sie. Sie können dies sofort mit einer Root-Shell tun:

echo -n -e '\x00\x00\xFF' > /dev/fb0

Es setzt das allererste (oben links) Pixel auf meinem 32-Bit-Framebuffer auf Rot:

Sie können dies vollständig innerhalb von C tun, indem Sie /dev/fb0 öffnen und Bytes schreiben. Memory Mapping kann Ihr Freund werden. Das funktioniert nur ohne X-Server oder in einer virtuellen Konsole. Drücken Sie Strg+Alt+F1, um darauf zuzugreifen.

PS:Das Visualisieren zufälliger Daten wie Ihrer Mausbewegung kann auch Spaß machen:

cat /dev/input/mouse0 > /dev/fb0

PPS:Bitte beachten Sie auch, dass praktisch jede reale Desktop-Anwendung einen direkteren Zugriff auf die Hardware für einige ausgefallene Dinge wie Hardwarebeschleunigung zum Zeichnen, 3D- und Video-Rendering benötigt. Das einfache Frame-Buffer-Gerät wird all das nicht gut machen.


Ich würde dringend empfehlen, mit ncurses zu beginnen.

Im Gegensatz zu komplexeren Grafiksystemen basiert es rein auf Text, sodass Sie sich nicht in den Details von Bildschirmtreibern und Grafikbibliotheken verzetteln müssen. Die Grundprinzipien, Fenster auf einem Bildschirm zu platzieren, den Fokus zwischen Fenstern zu verschieben usw., gelten jedoch immer noch. Und Sie können immer noch etwas zeichnen, auf der Ebene von einzelnen Zeichenblöcken und ASCII-Grafiken.

Natürlich bauen Sie das immer noch auf einer Bibliothek auf, aber es ist eine Bibliothek, die Sie leicht verstehen können. Darüber hinaus ist es eine Bibliothek, in der der Quellcode frei verfügbar, ziemlich gut dokumentiert und nicht zu undurchdringlich ist, wenn Sie ihn lesen möchten. Sie können es sogar selbst ändern, wenn Sie möchten. Oder Sie könnten sich alle darin enthaltenen Bibliotheksfunktionen ansehen, um herauszufinden, was die API sein muss, und sie basierend auf diesem Design selbst von Grund auf neu schreiben.


Linux
  1. Wie funktioniert das Sticky Bit?

  2. Wie funktioniert der Befehl „ls“ unter Linux/Unix?

  3. Wie funktioniert copy_from_user aus dem Linux-Kernel intern?

  4. Wie identifiziert man die verwendete Linux-Distribution?

  5. Wie funktioniert ein Debugger unter Linux?

Linux – Wie installiere ich X11 auf dem eigenen Linux-Buildroot-System?

Linux – Wie funktioniert die Anzeige von Linux?

Was ist Source Command in Linux und wie funktioniert es?

Wie funktioniert Swap-Speicher in Linux?

Wie lädt Linux das 'initrd'-Image?

Wie funktioniert die Anzeige von Linux?