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) je v informatice označení pro speciální systémové volání v operačním systému DOS, které umožňuje program ukončit, ale zároveň ho uchovat v operační paměti. Označení TSR se používá i pro tyto samotné programy. TSR umožnilo v jednoúlohovém systému, jako je DOS, vyvolat zdání funkčního multitaskingu. TSR programy se používaly jako ovladače pro různá zařízení (typicky pro myš, českou mapu klávesnice), ale využívaly ho i počítačové viry.

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 nedostupná (resp. obsazená, resp. nepřítomná). 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.

Přerušení sdílení[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]

Zatímco velmi užitečné, nebo dokonce nezbytné k překonání DOS limitů, měly TSR programy pověst problémových. Operační systém mnoha programů efektivně přenášel v různých dokumentovaných nebo nedokumentovaných cestách, což často vedlo ke zhroucení systémů, jejich aktivací nebo deaktivaci při použití konkrétních aplikací programů nebo jiných TSR. Jak bylo vysvětleno výše, některé viry zakódované jako TSR byly záměrně rušivé. Navíc, všechny kódy programů v 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.

V pozdních osmdesátých a brzkých devadesátých letech, mnoho videoher na platformě PC naráželo na tento limit a zbylo méně a méně prostoru pro TSR - i ty základní, jako je CD-ROM ovladače - a uspořádání věcí tak, aby byl dostatek volné RAM, aby spuštění hry, při současném zachování aktuálních TSR, nebylo černou magii. Mnoho hráčů mělo několik zaváděcích disků s různými konfiguracemi pro různé hry. V pozdější verzi MS-DOS "boot menu" skripty umožnily různé konfigurace, které mohly být nastavitelné pomocí 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řekryvy. 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 nástavce provádějící 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 příchodem rozšířené paměťové desky 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. Proslulí správci pamětí jsou QRAM a QEMM od Quarterdeck, 386Max od Qualitas, CEMM Compaq a později EMM386 od společnosti Microsoft. Oblast paměti využitelná pro načtení TSR nad 640 kB, se nazývají "upper memory blocks" (UMB) a načítání programů do nich se nazývá načtení high hodnoty. Později paměťoví manažeři začali počítat s programy, které se pokusí automaticky zjistit, jak nejlépe rozdělit TSR mezi low a high hodnotou paměti (Quarterdeck's Optimize nebo Microsoft's MemMaker) s cílem pokusit se maximalizovat dostupný prostor v prvních 640 kB paměti.

Úpadek[editovat | editovat zdroj]

S vývojem her využívajících DOS rozšíření (pozoruhodný dřívější příklad byl Doom), které obešly 640 KB bariéru, mnoho otázek týkajících se 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 je záplatování IDT, protože skutečný-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]