Terminály tajemství zbavené: historie a současnost

10. 4. 2014
Doba čtení: 5 minut

Sdílet

Terminálový subsystém TTY je středobodem každého linuxového a obecně i UNIXového systému. Jeho důležitost je ale často přehlížená a je těžké sehnat kvalitní popis vhodný pro začátečníky. Přitom pochopení funkce terminálového subsystému je klíčové pro každého vývojáře a pokročilého uživatele.

Článek je překladem zápisku The TTY demystified, který napsal Linus Akesson. Překlad vychází se souhlasem původního autora.

Ale pozor, to co uvidíte není vždy zcela elegantní. Ve skutečnosti je celý subsystém, ačkoli vcelku funkční z uživatelského pohledu, velkou haldou speciálních případů. Abychom to pochopili, je třeba se vrátit zpátky v čase.

Historie

V roce 1869 byl vynalezen přístroj pro dálkový přenos burzovních informací. Jednalo se o elektromechanický stroj skládající se z psacího stroje, dlouhého páru drátů a jednoduché tiskárny. Tento koncept se později zdokonalil v dálnopis, který byl rychlejší a založený na sadě znaků podobné ASCII (ve skutečnosti se používala pětibitová abeceda ITA-2 – pozn. překl.). Dálnopisy bývaly dokonce propojené do globální telexové sítě, kterou byly (v Česku do roku 2008) předávány telegramy. Dálnopisy se však vyvíjely bez návaznosti na počítače.

Dálnopisy

Počítače v té době, ještě velké a primitivní, začaly být schopny komunikovat s uživatelem v reálném čase. Když bylo nakonec příkazovým řádkem nahrazeno dávkové zpracování úloh, dálnopisy se ukázaly jako vhodná vstupní a výstupní zařízení, neboť byly na trhu k dispozici. Spousta vzájemně ne zcela kompatibilních modelů dálnopisů na trhu přímo volala po softwarové přizpůsobovací mezivrstvě. Ve světě UNIXu to znamená, že jádro operačního systému obsluhuje všechny nízkoúrovňové detaily jako délku slova, přenosovou rychlost, řízení toku, paritu, řídicí sekvence pro nejjednodušší editaci řádku a tak dále. Pokročilé pohyby kurzoru, barevný výstup a další pokročilé vlastnosti představené koncem sedmdesátých let na videoterminálech bez pohyblivých částí (jako třeba VT-100), byly ponechány aplikacím.

V současné době žijeme ve světě, kde jsou všechny fyzické dálnopisy a videoterminály prakticky vyhynulé. Nejste-li zrovna nadšenci do historie počítačů, pravděpodobně jsou všechny vaše terminály pouze softwarově emulovanými videoterminály. Ale jak uvidíme, dědictví starých litinových bestií je stále ukryto pod povrchem.

Použití terminálu

Uživatel píše na terminál (fyzický dálnopis). Ten je propojen sériovou linkou k UART řadiči počítače. Operační systém obsahuje ovladač pro UART, jehož úlohou je fyzicky přenášet bajty, kontrolovat paritu a ovládat řízení toku. Naivním přístupem by bylo přijaté bajty přímo předat aplikaci. Takový přístup by ale postrádal několik nezbytných funkcí:

Editace řádku. Většina uživatelů dělá během psaní chyby, takže se hodí mít možnost použít klávesu backspace. To by mohlo být implementováno v samotné aplikaci, ale v souladu s UNIXovou filozofií by aplikace měly být maximálně jednoduché. Z toho důvodu operační systém poskytuje editační buffer a základní editační příkazy (backspace, vymazání slova, vymazání a znovuvytištění řádku), které jsou ve výchozím nastavení povoleny, uvnitř tzv. linkové disciplíny (line discipline). Pokročilé aplikace mohou tyto funkce vypnout přepnutím disciplíny do režimu raw namísto výchozího režimu, označovaného jako upravený (cooked), nebo kanonický (canonical). Tak funguje většina dnešních interaktivních aplikací − editory, e-mailoví klienti, ale i shelly a další aplikace používající knihovny curses nebo readline, které přepnou disciplínu do surového režimu a editaci řádku implementují samostatně. Součástí linkové disciplíny je také volba odezvy znaků při psaní ( echo) nebo automatické konverze mezi znaky CRLF. Linková disciplína se tak dá přirovnat k jednoduchému příkazu sed(1), který je implementován přímo v kernelu.

Mimochodem, jádro nabízí několik linkových disciplín. V jednu chvíli může být k dané sériové lince připojena právě jedna. Ta výchozí, která podporuje editaci řádku, se jmenuje N_TTY ( drivers/tty/n_tty.c máte-li rádi dobrodružství). Jiné disciplíny se používají pro jiné účely, jako například přenos paketových dat (PPP protokol, IrDA, sériová myš); tyto disciplíny jsou však mimo rámec tohoto článku.

Správa relace. Uživatel obvykle chce spustit několik programů zároveň a postupně s nimi pracovat. Skončí-li program v nekonečné smyčce, uživatel ho nejspíš bude chtít ukončit nebo pozastavit. Programy spuštěné na pozadí by měly běžet do chvíle, než se pokusí zapisovat na terminál; v tu chvíli by měly být pozastaveny. Stejně tak vstup od uživatele by měl přicházet pouze programu na popředí. Operační systém tyto funkce implementuje v ovladači TTY ( drivers/tty/tty_io.c).

Proces operačního systému „žije“ (tedy má výkonný kontext), když může sám provádět operace. Ovladač TTY z tohoto pohledu živý není; v objektové terminologii jde o pasivní objekt. Má určité vlastnosti a metody, ale jediný způsob, jak může něco dělat, je, že jeho metodu zavolá nějaký proces nebo obsluha přerušení. Stejně na tom je linková disciplína.

Tato trojice ovladače pro UART, linkové disciplíny a ovladače TTY dohromady tvoří TTY zařízení, nebo jen TTY. Uživatelský proces může ovlivnit chování kteréhokoli TTY zařízení přímou manipulací se speciálním souborem v adresáři /dev. K tomu jsou potřeba práva zápisu pro daného uživatele, což se řeší tak, že uživatel se dočasně stane vlastníkem speciálního souboru pro terminál, ze kterého je přihlášen. Tradičně to zajišťuje příkaz login(1), který běží s právy superuživatele.

Fyzické spojení terminálu s počítačem může být samozřejmě realizováno pomocí telefonní linky:

Tím se toho moc nemění, až na to, že systém teď musí být navíc schopen zvládnout situaci zavěšení telefonního modemu.

Pokračujme dál k typickému desktopovému systému. Takto funguje linuxová konzole:

Ovladač TTY a linková disciplína se chová stejně jako při předchozích případech, není zde ale žádný UART ani žádný fyzický terminál. Místo toho tu máme softwarově emulovaný videoterminál renderovaný na VGA displeji.

Konzolový subsystém je poněkud nepružný. Věci se začnou měnit, přesuneme-li emulaci terminálu do uživatelského prostoru. Takhle funguje xterm(1) a jeho klony:

ict ve školství 24

Aby bylo možné přesunout emulátor terminálu do uživatelského prostoru a zachovat přitom funkčnost TTY subsystému (tedy správy relace a linkové disciplíny), byly vynalezeny pseudoterminály neboli pty. Jak si jistě domyslíte, věci se ještě více zkomplikují, začnete-li spouštět pseudoterminály uvnitř pseudoterminálů. To je přesně to, co dělají nástroje jako screen(1) nebo  ssh(1).

Obsah následující části

Po úvodním představení základních principů se příště podíváme na vztah mezi procesy a úlohami během terminálové relace.

Autor článku

Ondřej Caletka vystudoval obor Telekomunikační technika na ČVUT a dnes pracuje ve vzdělávacím oddělení RIPE NCC, mezinárodní asociaci koordinující internetové sítě.