Terminate and Stay Resident

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

TSR (Terminate and Stay Resident, tj. ukončit a ponechat v paměti) nebo rezidentní programy je v operačním systému DOS označení pro programy, které po svém spuštění provedou určitou inicializační činnost, pak předají řízení operačnímu systému, ale zůstanou v paměti RAM počítače a mohou vykonávat různé funkce. Tyto programy často plní stejnou úlohu jako k instalovatelné ovladače zařízení – zpřístupňují zařízení, které standardní DOS nepodporuje – myši, CD mechaniky, síťové a zvukové karty karty a další hardware. Dalšími skupinami byly programy pro tisk na pozadí, síťové ovladače (např. pro přístup k síti NetWare nebo jádro pro komunikaci protokoly TCP/IP), programy pro podporu národního prostředí (např. česká mapa klávesnice a zavaděč národních fontů), a programy, které přímo komunikovaly s uživatelem, od programu pro zadávání semigrafických znaků, přes program pro interaktivní správu rezidentních programů po programy typu Personal Information Manager jako Borland Sidekick, které v jednoúlohovém systému DOS vyvolávaly zdání funkčního multitaskingu. Mechanismus TSR využívalo i množství počítačových virů, aby mohly ovlivňovat činnost počítače kdykoli, nejen v okamžiku spuštění infikovaného programu.

Popis funkce[editovat | editovat zdroj]

Operačním systém DOS je na rozdíl od pokročilejších systémů Microsoft Windows nebo Linux pouze jednoúlohový, takže v každém okamžiku je možné spustit nejvýše jeden počítačový program. Tato vlastnost umožnila snadné naprogramování jádra DOSu (též MS-DOS, FreeDOS atd.), které nemuselo být reentrantní a nemuselo obsahovat subsystém pro plánování procesů (tzv anglicky scheduler). Absence systémové podpory více programů zároveň ze strany jádra DOSu byla pro uživatele omezující, a proto programátoři často využívali mechanizmu TSR, který mohl vyvolat zdání současného běhu více úloh (tzv. multitasking), který podporují až pokročilejší operační systémy (Microsoft Windows, Linux, Mac OS X a další).

Systém DOS využívá pro komunikaci s uživatelem příkazový řádek (se shellem COMMAND.COM). Po spuštění programu je výzva shellu (anglicky prompt) deaktivována a řízení je předáno spuštěnému programu. Teprve po ukončení programu je po návratu do DOSu (resp. do interpretu COMMAND.COM) výzva znovu aktivována. Systémové volání TSR spuštěný program ukončí, ale ponechá ho v paměti a zároveň je operační paměť alokovaná programem označena jako obsazená. Program fakticky dále nepokračuje, ale zůstává v RAM (označujeme ho jako rezidentní program).

Rezidentní program (též TSR program) musí sám zajistit, že bude vhodným způsobem aktivován (typicky pomocí modifikace tabulky přerušení) a zároveň že neporuší omezení samotného jádra DOSu. Rezidentní program nesmí volat systémové služby jádra DOSu, pokud tuto službu volá jiný program. Zároveň musí sám ošetřit své případné výstupy na obrazovku a zajistit, aby jimi nezpůsobil havárii (například zaseknutí grafické karty tím, že do ní bude nesprávně zapisovat, protože není v grafickém, ale textovém režimu).

Rezidentní programy se používaly velmi často jako ovladače počítačové myši, kdy byly aktivovány přerušením přicházejícím od myši přes sériový port. Také se využívaly jako podpora české mapy klávesnice (umožňovaly psaní českých znaků), které byly aktivovány přerušením od klávesnice a vystupovaly jako rozšíření její obsluhy (tzv. obsluha přerušení, též ISR). Stejný princip zneužívaly i počítačové viry, které například „rozšířily“ schopnosti systémových volání pro zápis na pevný disk nebo disketu, čímž si zajistily schopnost vlastního šíření.

Použití TSR[editovat | editovat zdroj]

Původní volání, INT 27h, se nazývá terminate but stay resident, proto jméno TSR. Použitím tohoto volání, může program vytvořit 64KB jeho rezidentní paměti. MS-DOS verze 2.0 představil vylepšené volání INT 31H 21H - function 'Keep Process', které odstranilo omezení předchozí verze a nechá program vrátit návratový kód. Před provedením tohoto volání, může program nainstalovat do sebe jeden nebo více přerušovacích manipulátorů, takže může být znovu zavoláno. Instalace hardwarového vektoru přerušení umožňuje tomuto programu reagovat na hardwarové události. Instalace softwarového vektoru přerušení umožňuje zavolání v současné době běžícím programem. Instalace obsluhy přerušení časovače umožňuje TSR pravidelné spouštění (viz ISA) programovatelného intervalového časovače, a to zejména v sekci "IBM PC compatible").

Typický způsob využití vektoru přerušení zahrnuje čtení jeho současné hodnoty (adresu), ukládání do paměťového prostoru TSR, a instalaci ukazatele na svůj vlastní kód. Uložené adresy se volají po tom, co TSR obdržel přerušení a dokončil jeho zpracování. Ve skutečnosti tvoří jednotlivě spojený seznam manipulátorů přerušení, také nazývaný 'interrupt service routines', nebo ISR. Tento postup instalace ISR se nazývá řetězení, hákování přerušení nebo vektor přerušení.

Řetězením vektorů přerušení TSR mohou programy získat úplnou kontrolu nad počítačem. TSR může mít jeden ze dvou módů:

  • Získat úplnou kontrolu přerušení volání do ostatních TSR, které byly předtím změněny stejným vektorem přerušení.
  • Kaskády s ostatními TSR se volají starým vektorem přerušení. To může být provedeno před nebo po provedení jejich skutečného kódu. Tímto způsobem vznikne TSR řetěz programů, kde každý z nich volá ten příští.

'Terminate and stay resident' metoda byla použita ve většině MS-DOS virů, které mohou buď převzít kontrolu nad počítačem nebo zůstat v pozadí. Viry mohou reagovat na I/O disku nebo nakazit spustitelné soubory (.EXE nebo .COM), které jsou spuštěny a datové soubory, které jsou otevřeny.

Části DOS, a to zejména ve verzích DOS 5.0 a novější, které používají tuto stejnou techniku u vykonávání užitečných funkcí, jako je například DOSKEY editor příkazové řádky a různé další instalovatelné pomůcky, lze nainstalovat a provozovat je na příkazovém řádku (ručně nebo z AUTOEXEC.BAT), a nikoli jako drivery přes CONFIG.SYS.

Program TSR lze nahrát kdykoliv. Někdy je načten okamžitě poté, co se operační systém nabootuje, tím, že je doslova uložený v AUTOEXEC.BAT dávkovém programu, případně na žádost uživatele (například Borland SideKick a Turbo Debugger nebo Quicken je QuickPay). Tyto programy budou, jak 'TSR' znamená, zůstávat v paměti, zatímco ostatní programy jsou spuštěné. Většina z nich nemá možnost vytažení sebe z paměti, takže volání TSR znamená, že program zůstane v paměti, do restartu. Nicméně vytažení z paměti je možné externě, za použití pomůcek jako MARK.EXE / RELEASE.EXE kombinovaných s TurboPower Software nebo softwarového restartu TSR. Tyto pomůcky chytí specifické kombinace kláves a propustil všechny TSR uložené po nich. Tak jako je řetězec ISR jednotlivě spojen, neexistuje žádné ustanovení jak objevit předchozí manipulátor adresy, nebo informovat své předchůdce, že je třeba aktualizovat jeho "další adresu, na kterou skočit", aby neodkazovaly na TSR, jenž si přejeme odstranit. Toto dalo vzniknout TSR spolupracujícím rámcům, například TesSeRact a AMIS.

Sdílení přerušení[editovat | editovat zdroj]

K řešení problému s mnoha TSR programy, které mají stejné přerušení, byla Ralfem Brownem navržena metoda tzv. Alternate Multiplex Interrupt Specification (AMIS) zlepšující dříve používané služby, nabízené prostřednictvím INT 2Fh. AMIS poskytuje způsoby, jak sdílet softwarové přerušení kontrolovaným způsobem. Byla vytvořena podle IBM Interrupt Sharing Protocol, původně vyvinutý pro sdílení hardwarového přerušení na procesoru x86.

AMIS služby jsou k dispozici prostřednictvím Int 2Dh.

Návrh ve své době nikdy nezískal širokou podporu mezi programátory. Existoval zároveň s několika jinými konkurenčními specifikacemi různé složitosti.

Závady[editovat | editovat zdroj]

Přes svoji užitečnost způsobovaly TSR programy problémy. Vzájemné interakce programů, které využívaly služby operačního systému nedokumentovaným nebo nebezpečným způsobem, mohly způsobovat zaseknutí počítače nebo zhroucení systému. Jak bylo vysvětleno výše, některé viry zakódované jako TSR byly záměrně rušivé. Každý rezidentní program navíc zabírá část část paměti a systémech DOS, dokonce i ty s velkým množstvím fyzické paměti RAM, musely být vloženy do prvních 640 KB RAM (konvenční paměti). TSR nebyly výjimkou, a zabíraly místo z těchto 640 kb, které tak nebylo k dispozici na aplikační programy. To znamenalo, že psaní TSR byla výzva k dosažení co nejmenší velikosti, a to byl díky požadavku kompatibility s mnoha softwarovými produkty od různých dodavatelů často velmi frustrující úkol.

Okolo roku 1990 se paměťové nároky mnoha her na platformě PC přesahovaly 500 KB, takže při obsazení paměti několika TSR - i těmi základními, jako je ovladač CD-ROM - nebylo možné tyto hry spustit a uspořádání programů tak, aby byl dostatek volné RAM pro spuštění hry, připomínalo černou magii. Mnoho hráčů používalo několik zaváděcích disků, každý s jinou konfigurací pro jinou hru. Pozdější verze MS-DOSu dovolovaly výběr konfigurace pomocí "boot menu", což umožňovalo použití jediného "boot disku". Ke konci devadesátých letech, když mnoho her bylo ještě psány pro DOS, byl limit 640 kB nakonec překonán tím, že části herních dat a/nebo programového kódu byl nad prvním 1 MB paměti a pomocí kódu snížil 640K přístup rozšířené paměti (pomocí extra-DOSian metody). Kód je přeměněn na nejnižší 1 MB RAM jako překryvné moduly. Protože programování s mnoha překryvy je výzva sama o sobě, jakmile byl program příliš velký, aby se úplně vešel do 512 KB, využití rozšířené paměti bylo téměř vždy provedeno pomocí tří-partového DOS extenderu podle standardu VCPI nebo DPMI. Protože to je mnohem snadnější a rychlejší přístup k paměti nad hranici 1 MB, a lze spustit kód v této oblasti, když je x86 procesor přepnut z reálného režimu do chráněného režimu. Nicméně, protože DOS a všechny DOS programy běží v reálném režimu (DPMI nebo VCPI je chráněný režim programu vypadající jako reálný režim programu DOS a zbytek systému se přepíná mezi dvěma režimy), DOS TSR a drivery zařízení také běží v reálném režimu, a tak se mu kdykoliv dostává kontrola. "DOS extender" musí přepnout zpět do reálného režimu dokud se zříká kontroly, jinak vznikne časová penalizace.

Návrat[editovat | editovat zdroj]

S nástupem desek rozšířené paměti a zejména procesorů Intel 80386 v druhé polovině osmdesátých let, přichází možné použití paměti nad 640 kB k načtení TSR. To vyžadovalo komplexní softwarové řešení s názvem Expanded memory managers, což zajistilo nějaký další volný prostor na několik let. K nejznámějším správcům paměti patřily QRAM a QEMM firmy Quarterdeck, 386Max firmy Qualitas, CEMM firmy Compaq a později EMM386 firmy Microsoft. Oblasti paměti nad adresou 640 kB využitelné pro načítání TSR, se nazývají "upper memory blocks" (UMB) a načítání programů do nich se anglicky nazývá loading high. Programy pro správu paměti začaly později používat programy, které se pokoušely automaticky zjistit, jak nejlépe rozdělit TSR mezi low a high hodnotou paměti (Optimize firmy Quarterdeck nebo MemMaker firmy Microsoft) s cílem maximalizovat dostupný prostor v prvních 640 KB paměti.

Úpadek[editovat | editovat zdroj]

S vývojem her a programů využívajících DOS extendery (např. Doom), které obcházely 640 KB bariéru, mnoho problémů s TSR zmizelo, s rozšířením Microsoft Windows, a zejména Windows 95 (následuje Windows 98) - který měl mnoho TSR zbytečných a některé TRS neslučitelné - TSR zastaralé, ale aplikace Win16 mohly dělat triky TSR - jako jsou úpravy tabulky vektorů přerušení, protože reálný režim Windows to dovoloval. TSR nyní zmizely téměř úplně, multitasking operačních systémů jako Windows XP, Windows Vista, Windows 95, Mac OS X, Linux slouží jako zázemí pro více programů a driverů zařízení,které se mohou provozovat současně bez potřeby speciálních programovacích triků, a moderní pojetí chráněné paměti činí jádro a jeho moduly výhradně odpovědné za změnu přerušovací tabulky.

Externí odkazy[editovat | editovat zdroj]