Jak to funguje (Gnu/Linux + X11)
Přehled
Vypadá to nějak takto (ne kreslí v měřítku)
┌───────────────────────────────────────────────┐
│ User │
│ ┌─────────────────────────────────────────┤
│ │ Application │
│ │ ┌──────────┬─────┬─────┬─────┤
│ │ │ ... │ SDL │ GTK │ QT │
│ │ ├──────────┴─────┴─────┴─────┤
│ │ │ xLib │
│ │ ├────────────────────────────┤
├─────┴───┬────────┴──┐ X11 │
│ Gnu │ Libraries │ Server │
│ Tools │ │ │
├─────────┘ │ │
├─────────────────────┤ │
│ Linux (kernel) │ │
├─────────────────────┴─────────────────────────┤
│ Hardware │
└───────────────────────────────────────────────┘
Z diagramu vidíme, že X11 mluví převážně s hardwarem. Nicméně potřebuje mluvit přes jádro, aby zpočátku získal přístup k tomuto hardwaru.
Jsem trochu zamlžený v detailech (a myslím, že se to změnilo od doby, kdy jsem se na to díval naposledy). Existuje zařízení /dev/mem
který poskytuje přístup k celé paměti (myslím, že fyzické paměti), protože většina grafického hardwaru je mapována do paměti, lze tento soubor (viz vše je soubor) použít pro přístup k němu. X11 soubor otevře (jádro používá oprávnění k souboru, aby zjistilo, zda to dokáže), pak X11 použije mmap
k mapování souboru do virtuální paměti (aby vypadal jako paměť), nyní paměť vypadá jako paměť. Po mmap
, jádro není zapojeno.
X11 potřebuje vědět o různém grafickém hardwaru, protože k němu přistupuje přímo prostřednictvím paměti.
(může dojít ke změnám, konkrétně model zabezpečení, který již nemusí umožňovat přístup k VŠEM paměti.)
Linux
Ve spodní části je Linux (jádro):malá část systému. Poskytuje přístup k hardwaru a implementuje zabezpečení.
Gnu
Pak Gnu (knihovny; bash; tools:ls atd.; kompilátor C atd.). Většina operačního systému.
Server X11 (např. x.org)
Pak X11 (nebo Wayland, nebo ...), základní GUI subsystém. Toto běží v uživatelské zemi (mimo jádro):je to jen další proces s určitými oprávněními. Jádro se do toho nezapojuje, kromě toho, že poskytuje přístup k hardwaru. A poskytování meziprocesové komunikace, aby ostatní procesy mohly komunikovat se serverem X11.
Knihovna X11
Jednoduchá abstrakce, která vám umožní psát kód pro X11.
Knihovny GUI
Další jsou knihovny jako qt, gtk, sdl – usnadňují používání X11 a práci na jiných systémech, jako je wayland, Microsoft Windows nebo MacOS.
Aplikace
Aplikace jsou umístěny na vrcholu knihoven.
Některé nízkoúrovňové vstupní body pro programování
xlib
Použití xlib je dobrý způsob, jak se dozvědět o X11. Nejprve si však přečtěte něco o X11.
SDL
SDL vám poskytne nízkoúrovňový přístup přímo k bitovým rovinám, do kterých můžete přímo kreslit.
Jít níž
Pokud chcete jít níž, pak si nejsem jistý, jaké jsou dobré současné možnosti, ale zde je několik nápadů.
- Pořiďte si starou Amigu nebo simulátor. A dobrá dokumentace. např. https://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up (měl jsem 2 knihy, tuto a podobné).
- Podívejte se, co se dá dělat na malinovém pi. Na to jsem se nedíval.
Odkazy
X11
https://cs.wikipedia.org/wiki/X_Window_System
Moderní způsoby
Toto psaní mě zaujalo, a tak jsem se podíval na moderní rychlý způsob, jak to udělat. Zde jsou některé odkazy:
https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/
Odpověď ctrl-alt-delor vám poskytuje dobrý přehled o obecné architektuře. Pro více praktický přístup vám dávám odpověď týkající se „nic jiného než linuxového jádra a programování v C“.
Rád píšu každou chvíli přímo do frame-bufferu. Ovladač zařízení s vyrovnávací pamětí snímků za vás udělá všechny ty zdlouhavé věci blízké hardwaru „jak to nakonec skončí na obrazovce“. Můžete to udělat okamžitě pomocí kořenového shellu:
echo -n -e '\x00\x00\xFF' > /dev/fb0
Nastaví úplně první (vlevo nahoře) pixel na červenou na mém 32bitovém framebufferu:
Můžete to udělat úplně z C otevřením /dev/fb0 a zápisem bajtů. Mapování paměti se může stát vaším přítelem. Toto funguje pouze bez X serveru nebo ve virtuální konzoli. Pro přístup k němu stiskněte Ctrl+Alt+F1.
PS:Vizualizace náhodných dat, jako je pohyb myši, může být také zábavná:
cat /dev/input/mouse0 > /dev/fb0
PPS:Vezměte prosím také na vědomí, že prakticky jakákoliv desktopová aplikace v reálném světě vyžaduje přímější přístup k hardwaru pro některé fantastické věci, jako je hardwarová akcelerace pro kreslení, 3D a vykreslování videa. Jednoduché zařízení s vyrovnávací pamětí snímků nic z toho neudělá dobře.
Důrazně doporučuji začít s ncurses.
Na rozdíl od složitějších grafických systémů je založen čistě na textu, takže se není třeba zabředávat do detailů ovladačů obrazovky a grafických knihoven. Základní principy umísťování oken na obrazovku, přesouvání fokusu mezi okny a tak dále však stále platí. A stále můžete kreslit na úrovni bloků jednotlivých znaků a ASCII art.
Samozřejmě to stále stavíte na knihovně, ale je to knihovna, které můžete snadno porozumět. A víc než to, je to knihovna, kde je zdrojový kód volně dostupný, poměrně dobře zdokumentovaný a není příliš neprostupný, pokud si ho chcete přečíst. Pokud chcete, můžete si jej dokonce sami upravit. Nebo se můžete podívat na všechny tamní funkce knihovny, abyste našli, jaké API potřebuje, a na základě tohoto návrhu si to sami sepište od začátku.