GNU/Linux >> Znalost Linux >  >> Linux

Jak funguje linuxové GUI na nejnižší úrovni?

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.


Linux
  1. Jak funguje příkaz ps?

  2. Jak funguje rozhraní zpětné smyčky

  3. Jak funguje vzor <( cmd ) v bash?

  1. Jak Sticky Bit funguje?

  2. Účel .bashrc a jak to funguje?

  3. Jak funguje příkaz 'ls' v Linuxu/Unixu?

  1. Jak interně funguje copy_from_user z jádra Linuxu?

  2. Jak linuxové jádro určuje pořadí volání __init?

  3. Jak lze identifikovat používané linuxové distro?