Rezidentní program (nebo TSR program , z angličtiny. Terminate and Stay Resident - „dokončit a zůstat rezidentní“) - v operačním systému MS-DOS program , který vrátil řízení shellu operačního systému ( command.com ) nebo doplněk operačního systému ( Norton Commander atd.), ale zůstává v paměti RAM osobního počítače [1] . Rezidentní program se aktivuje pokaždé, když dojde k přerušení , jehož vektor se program změnil na adresu jedné ze svých procedur .
Při práci s MS-DOS byly rezidentní programy široce používány k dosažení různých cílů (například crackery na klávesnici , programy pro přístup k LAN , správci zpožděného tisku , viry ).
Metodou inicializace a vyvolání operačním systémem je třeba odlišit rezidentní programy od „skutečných“ ovladačů MS-DOS , které jsou vnořeny operačním systémem do jeho jádra při bootování.
V éře multitaskingových OS se programy, které se neustále načítají a běží na pozadí, někdy nazývají rezidentní programy. Ale použití tohoto termínu je nesprávné ve vztahu k multitasking OS.
Rezidentní programy mohou převzít obsluhu přerušení, například přerušení souvisejících s tiskem nebo přístupem na klávesnici atd.
Takové programy byly obvykle spouštěny prostřednictvím souboru AUTOEXEC.BAT nebo přímo. Zachytili přerušení určená pro práci s klávesnicí. Jakmile uživatel stiskne předdefinovanou kombinaci kláves, aktivuje se rezidentní program. V horní části obrazu na obrazovce se zobrazí dialogové okno rezidentního programu.
Někdy se místo ovladačů ke stažení používají k obsluze nestandardního hardwaru rezidentní programy. V tomto případě může rezidentní program vložit svůj vlastní handler, jehož prostřednictvím mohou všechny aplikační programy přistupovat k hardwaru.
Rezidentní moduly některých systémů pro správu databází ( DBMS ) fungují podobně. Aplikační program odesílá dotazy do databáze přes přerušení, které se nastavuje při spouštění takového DBMS.
Na rezidentní programy jsou uvalena četná omezení, která programátorovi ztěžují práci.
TSR například nesmějí libovolně používat přerušení systému MS-DOS. Důvodem je, že MS-DOS byl od začátku navržen jako jednoúlohový operační systém, takže funkce přerušení systému MS-DOS nejsou reentrantní.
Představme si takovou situaci.
Předpokládejme normální program nazvaný nějaká funkce přerušení systému MS-DOS, jehož dokončení trvá relativně dlouho (například zápis na disk).
Protože uživatel může kdykoli aktivovat rezidentní program, pokud nejsou přijata zvláštní opatření, je možné znovu volat stejnou funkci, jejíž zpracování ještě nebylo dokončeno. V tomto případě získáme zpětné volání funkce MS-DOS, které je neplatné kvůli skutečnosti, že funkce MS-DOS nejsou reentrantní.
Funkce systému BIOS také nejsou všechny opakované . Rezidentní program může bezpečně volat pouze přerušení INT 16h (které je navrženo pro práci s klávesnicí). Pokud potřebuje rezidentní program něco zobrazit na obrazovce, pak místo přerušení INT 10h byste měli znaky a jejich atributy zapsat přímo do video paměti.
Bez provedení zvláštních opatření nemůže rezidentní program volat mnoho funkcí knihovny překladače, protože ty způsobují přerušení systému MS-DOS. Například funkce malloc způsobí přerušení systému MS-DOS k určení množství volné paměti v systému.
Program má dvě možnosti, jak zůstat rezidentní v paměti - použít přerušení INT 27h nebo funkci přerušení INT 21h 31h.
Chcete-li použít přerušení INT 27h, registr segmentu CS musí ukazovat na PSP programu. V tomto případě by měl být do registru DX zapsán offset posledního bajtu programu plus jeden bajt.
Je snadné vidět, že tato metoda je nejvhodnější pro com-programy, protože při použití přerušení INT 27h není možné ponechat rezidentní program delší než 64 KB v paměti.
Další, pohodlnější způsob je zavolat funkci přerušení 31h INT 21h . Registr AL by měl obsahovat kód ukončení programu, registr DX by měl obsahovat délku rezidentní části programu v odstavcích. Výše uvedené omezení velikosti programu již neplatí.
Chcete-li ponechat rezidentní program v paměti, jehož velikost přesahuje 64 KB, můžete použít pouze poslední metodu. Neměli byste se nechat unést velkými rezidentními programy, protože paměť, kterou zabírají, potřebují jiné programy.
Nejprve se do paměti ukládají data, potom obsluhy přerušení (vektory) a nakonec inicializační sekce (která má vstupní bod INIT a právě v tomto bodě se při spuštění programu přenáší řízení). Hlavním úkolem inicializační sekce je zřízení rezidenta v paměti (je potřeba pouze při instalaci programu, poté je z paměti odstraněn). Tato sekce se nachází na vyšších adresách (protože můžeme „odříznout“ pouze vyšší adresy).
Chcete-li použít přerušení 27h, segmentový registr CS musí ukazovat na PSP programu a do registru DX musí být zapsán posun posledního bajtu programu plus jeden bajt. Je snadné vidět, že tento způsob pobytu je nejvhodnější pro programy ve formátu COM. Rezidentní program nemůžete ponechat delší než 64 kB.
Dalším, pohodlnějším způsobem je použití funkce přerušení INT 21h 31h. V registru AL můžete zadat kód ukončení programu, registr DX by v tomto případě měl obsahovat délku rezidentní části programu v odstavcích. Na délku programu již není limit 64 kilobajtů. Použití této funkce je jediný způsob, jak ponechat rezidentní program delší než 64 kB.
Neměli byste se však nechat unést dlouhými programy TSR, protože obvykle můžete uvolnit paměť obsazenou již nepotřebným rezidentním programem pouze restartováním operačního systému.
Knihovna funkcí Quick C obsahuje speciální funkci pro ponechání programu rezidentního v paměti. Tato funkce používá INT 21h (funkce 31h) a jmenuje se _dos_keep(). Prvním parametrem funkce je výstupní kód (co se zapisuje do registru AL) a druhým je délka rezidentní části programu v odstavcích.
Je nutné určit, zda TSR již začalo nebo ne. Existuje několik možností, jak určit začátek TSR:
Pro: Široké použití. Nevýhoda: sada podpisů je poměrně omezená (podpis se může náhodně shodovat). Spolehlivost je menší než u 2. metody.
Když je do paměti nainstalován rezidentní program, vektory jsou zachyceny. V tomto případě jsou možná následující schémata interakce mezi starou a novou obsluhou přerušení:
Vrácení je od starého handlera. Mezi obsluhou přerušení existuje řetězec. Nevýhoda: Často je nutné, aby se nové funkce spouštěly po starých. Toto schéma není možné.
V závislosti na interakci nových ISR se rozlišují různé úrovně složitosti.
Pokud se podíváte na funkce BIOSu, když běží, všimnete si, že nejsou reentrantní, to se týká funkcí práce s diskem INT 13 a obrazovkou INT 10. Reentrance je vlastnost, která umožňuje program nebo nějaký fragment z toho se přeruší a spustí se (znovu). To znamená, že program se může přerušit sám. Že. Funkce systému BIOS jsou neopakovatelné. Klasicky bude potřeba napsat nový handler INT 13. Nechat zavolat rezidentní funkci při stisku klávesy, pak je potřeba použít obsluhu přerušení klávesnice INT 9, která by měla zkontrolovat příznak: disk se zpracovává nebo ne . Pokud je příznak nula, pak lze zavolat náš RF program (který pracuje s INT 13). Ochrana je provedena pouze proti přerušení INT 13, protože zbytek přerušení používá funkce DOS.
Jedná se o programy, kde rezidentní funkce využívá funkce DOSu (např. RF používá INT 21). INT 21 není reentrant. Tento problém by bylo možné vyřešit stejně jako u INT 13. Tato metoda však nefunguje, protože funkce DOSu nemají vždy standardní zakončení (jsou některé výstupy, které nelze ovládat). Tyto funkce zahrnují 4C a 4B. OC má speciální příznak nazvaný příznak aktivity DOS, který se nazývá INDOS. Tento příznak je 0, pokud se INT 21 neprovádí, a ne 0, pokud je. Že. v programu je nutné analyzovat INDOS. Existuje standardní funkce pro získání příznaku INDOS, to je AH=34h přerušení int 21. Výsledkem této funkce je ES:BX -> inDOS. Tato funkce 34h musí být provedena v inicializační sekci. Je nutné opravit adresu tohoto příznaku INDOS ve statickém paměťovém umístění a poté jej použít v obslužných rutinách přerušení.
Po provedení 1. skupiny je možné vykonávat funkce jiné skupiny, nikoli však první, a naopak. Pro vyřešení problému se spuštěním rezidentní funkce v okamžiku provádění funkcí 1. skupiny se používá speciální přerušení INT 28. Uživatel může zachytit vektor INT 28 a provést příslušné akce (z 2. skupiny). Například nechme naši rezidentní funkci používat pouze 2. skupinu funkcí. Pokud je DOS aktivní, pak TSR volá pouze INT 28 a pokud není aktivní, způsobuje přerušení pouze od časovače. Výstup obrazovky lze provést přímo do paměti RAM displeje (obejít DOS a BIOS). Pro práci s klávesnicí použijte funkce systému BIOS. Pro práci s obrazovkou a klávesnicí se používají funkce 2. skupiny, ale obrazovka a klávesnice jsou považovány za CON zařízení a práce s ní probíhá jako se souborem.