Předpokládejme, že stisknu A zadejte textový editor a tím se vloží znak a
v dokumentu a zobrazí jej na obrazovce. Vím, že aplikace editoru nekomunikuje přímo s hardwarem (mezi tím je jádro a podobně), takže co se děje uvnitř mého počítače?
Přijatá odpověď:
Existuje několik různých scénářů; Popíšu ty nejčastější. Následující makroskopické události jsou:
- Vstup:událost stisknutí klávesy se přenese z hardwaru klávesnice do aplikace.
- Zpracování:o tom rozhoduje aplikace, protože klíč A bylo stisknuto, musí zobrazit znak
a
. - Výstup:Aplikace vydá příkaz k zobrazení
a
na obrazovce.
Aplikace GUI
De facto standardním grafickým uživatelským rozhraním unixových systémů je X Window System, často nazývaný X11, protože se stabilizoval v 11. verzi svého základního protokolu mezi aplikacemi a zobrazovacím serverem. Mezi jádrem operačního systému a aplikacemi je umístěn program zvaný X server; poskytuje služby včetně zobrazení oken na obrazovce a přenosu stisku kláves do okna, které má fokus.
Vstup
+----------+ +-------------+ +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+ +-------------+ +-----+
USB, PS/2, … PCI, …
key down/up
Nejprve se informace o stisknutí a uvolnění klávesy přenesou z klávesnice do počítače a uvnitř počítače. Podrobnosti závisí na typu hardwaru. Nebudu se touto částí více zabývat, protože informace zůstávají v této části řetězce stejné:byla stisknuta nebo uvolněna určitá klávesa.
+--------+ +----------+ +-------------+
-------->| kernel |------->| X server |--------->| application |
+--------+ +----------+ +-------------+
interrupt scancode keysym
=keycode +modifiers
Když dojde k hardwarové události, CPU spustí přerušení, které způsobí spuštění nějakého kódu v jádře. Tento kód detekuje, že hardwarovou událostí je stisknutí nebo uvolnění klávesy z klávesnice, a zaznamená kód skenování který identifikuje klíč.
X server čte vstupní události prostřednictvím souboru zařízení, například /dev/input/eventNNN
na Linuxu (kde NNN je číslo). Kdykoli dojde k události, jádro signalizuje, že existují data ke čtení z tohoto zařízení. Soubor zařízení přenáší události klíče nahoru/dolů se skenovacím kódem, který může, ale nemusí být identický s hodnotou přenášenou hardwarem (jádro může přeložit skenovací kód z hodnoty závislé na klávesnici na běžnou hodnotu a Linux nepřesílá znovu skenovací kódy, které nezná).
X nazývá skenovací kód, který přečte, kód klíče . X server udržuje tabulku, která převádí kódy klíčů na keysymy (zkratka pro „key symbol“). Keycodes jsou číselné, zatímco keysyms jsou názvy jako A
, aacute
, F1
, KP_Add
, Control_L
, … Symbol kláves se může lišit v závislosti na tom, které modifikační klávesy byly stisknuty (Shift , Ctrl , …).
Existují dva mechanismy pro konfiguraci mapování z kódů kláves na keysyms:
- xmodmap je tradiční mechanismus. Jedná se o jednoduchou tabulku mapující kódy kláves na seznam klíčových symbolů (neupravený, posunutý, …).
- XKB je výkonnější, ale složitější mechanismus s lepší podporou více modifikátorů, mimo jiné zejména pro dvoujazyčnou konfiguraci.
Aplikace se připojí k X serveru a obdrží upozornění, když je stisknuta klávesa, když je aktivní okno dané aplikace. Upozornění ukazuje, že byl stisknut nebo uvolněn určitý klávesový sym, a také jaké modifikátory jsou aktuálně stisknuty. Keysyms můžete zobrazit spuštěním programu xev
z terminálu. Co aplikace s informacemi udělá, je na ní; některé aplikace mají konfigurovatelné vazby kláves.
V typické konfiguraci, když stisknete klávesu označenou A bez modifikátorů se odešle keyym a
do aplikace; pokud je aplikace v režimu, ve kterém píšete text, vloží se znak a
.
Vztah rozložení klávesnice a xmodmap jde do podrobností o vstupu z klávesnice. Jak fungují události myši v linuxu? poskytuje přehled o vstupu myši na nižších úrovních.
Výstup
+-------------+ +----------+ +-----+ +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+ +----------+ +-----+ +---------+
text or varies VGA, DVI,
image HDMI, …
Existují dva způsoby, jak zobrazit znak.
- Vykreslování na straně serveru :aplikace říká X serveru „nakreslete tento řetězec v tomto písmu na této pozici“. Písmo se nachází na X serveru.
- Vykreslování na straně klienta :aplikace vytvoří obrázek, který představuje znak ve zvoleném písmu, a poté řekne X serveru, aby tento obrázek zobrazil.
Viz Jaké jsou účely různých typů písem XWindows? pro diskusi o vykreslování textu na straně klienta a serveru pod X11.
Co se stane mezi X serverem a Graphics Processing Unit (procesor na grafické kartě), je velmi závislé na hardwaru. Jednoduché systémy mají X server kreslení v oblasti paměti nazývané framebuffer, kterou GPU zachycuje pro zobrazení. Pokročilé systémy, jaké najdete na jakémkoli PC nebo smartphonu 21. století, umožňují GPU provádět některé operace přímo pro lepší výkon. Nakonec GPU přenáší obsah obrazovky pixel po pixelu každý zlomek sekundy na monitor.
Aplikace v textovém režimu běžící v terminálu
Pokud je váš textový editor aplikací v textovém režimu spuštěnou v terminálu, pak je to terminál, který je aplikací pro účely výše uvedené části. V této části vysvětlím rozhraní mezi aplikací v textovém režimu a terminálem. Nejprve popisuji případ emulátoru terminálu běžícího pod X11. Jaký je přesný rozdíl mezi „terminálem“, „skořápkou“, „tty“ a „konzolí“? zde může být užitečné pozadí. Po přečtení tohoto si možná budete chtít přečíst mnohem podrobněji Jaké jsou odpovědnosti jednotlivých komponent pseudoterminálu (PTY) (software, hlavní strana, podřízená strana)?
Vstup
+-------------------+ +-------------+
----->| terminal emulator |-------------->| application |
+-------------------+ +-------------+
keysym character or
escape sequence
Emulátor terminálu přijímá události jako „Left
bylo stisknuto při Shift
byl dole“. Rozhraní mezi emulátorem terminálu a aplikací v textovém režimu je pseudoterminál (pty) , znakové zařízení, které přenáší bajty. Když emulátor terminálu přijme událost stisknutí klávesy, transformuje ji na jeden nebo více bajtů, které aplikace přečte ze zařízení pty.
Tisknutelné znaky mimo rozsah ASCII se přenášejí jako jeden nebo více bajtů v závislosti na znaku a kódování. Například v kódování UTF-8 znakové sady Unicode jsou znaky v rozsahu ASCII kódovány jako jeden bajt, zatímco znaky mimo tento rozsah jsou kódovány jako více bajtů.
Stisky kláves, které odpovídají funkční klávese nebo tisknutelném znaku s modifikátory, jako je Ctrl nebo Alt jsou odesílány jako úniková sekvence . Únikové sekvence se obvykle skládají z escape znaků (hodnota bajtu 27 =0x1B =