Rezidens program (vagy TSR program az angol nyelvből. Terminate and Stay Resident – „teljes és rezidens marad”) – az MS-DOS operációs rendszerben , olyan program , amely visszaadta az irányítást az operációs rendszer shelljének ( command.com ) vagy egy kiegészítő az operációs rendszerhez ( Norton Commander stb.), de a személyi számítógép RAM -jában marad [1] . Minden megszakításkor aktiválódik egy rezidens program , amelynek vektora a program valamelyik eljárásának címére változott .
Az MS-DOS-szal végzett munka során a rezidens programokat széles körben használták különféle célok elérése érdekében (például billentyűzettörők , LAN - hozzáférési programok , késleltetett nyomtatáskezelők , vírusok ).
Az operációs rendszer inicializálásának és meghívásának módszerével a rezidens programokat meg kell különböztetni a "valódi" MS-DOS illesztőprogramoktól , amelyeket az operációs rendszer a rendszermagba ágyaz be a rendszerindításkor .
A többfeladatos operációs rendszer korszakában az állandóan betöltődő és a háttérben futó programokat néha rezidens programoknak nevezik. De ennek a kifejezésnek a használata helytelen a többfeladatos operációs rendszerrel kapcsolatban.
A rezidens programok átvehetik a megszakítások kezelését, például a nyomtatással vagy a billentyűzet elérésével kapcsolatos megszakításokat stb.
Az ilyen programok általában az AUTOEXEC.BAT fájlon keresztül vagy közvetlenül futottak. Elfogták a billentyűzettel való együttműködésre tervezett megszakításokat. Amint a felhasználó megnyom egy előre meghatározott billentyűkombinációt, a rezidens program aktiválódik. A képernyőn a kép tetején megjelenik a rezidens program párbeszédpanele.
Néha rezidens programokat használnak letölthető illesztőprogramok helyett a nem szabványos hardverek kiszolgálására. Ebben az esetben a rezidens program beágyazhatja saját kezelőjét, amelyen keresztül minden alkalmazási program hozzáférhet a hardverhez.
Egyes adatbázis-kezelő rendszerek ( DBMS ) rezidens moduljai hasonlóan működnek. Az alkalmazási program lekérdezéseket küld az adatbázisnak egy ilyen DBMS indításakor beállított megszakításon keresztül.
Számos korlátozás vonatkozik a rezidens programokra, amelyek megnehezítik a programozók munkáját.
Például a TSR-ek nem használhatnak tetszés szerint MS-DOS megszakításokat. Ennek az az oka, hogy az MS-DOS-t kezdettől fogva egyfeladatos operációs rendszernek tervezték, így az MS-DOS megszakítási funkciói nem lépnek be újra.
Képzeljünk el egy ilyen helyzetet.
Tegyük fel, hogy egy normál program, az úgynevezett MS-DOS megszakítási funkció, amelynek végrehajtása viszonylag hosszú ideig tart (például lemezre írás).
Mivel a felhasználó különleges óvintézkedések hiányában bármikor aktiválhatja a rezidens programot, ezért lehetőség van ugyanazt a funkciót újra meghívni, amelynek feldolgozása még nem fejeződött be. Ebben az esetben egy MS-DOS függvény visszahívást kapunk, ami érvénytelen, mivel az MS-DOS függvények nem lépnek be újra.
A BIOS- funkciók szintén nem mindegyike tér vissza . Egy rezidens program csak az INT 16h megszakítást tudja biztonságosan hívni (amelyet a billentyűzettel való együttműködésre terveztek). Ha a rezidens programnak valamit meg kell jelenítenie a képernyőn, akkor az INT 10h megszakítása helyett a karaktereket és attribútumaikat közvetlenül a videomemóriába kell írni.
Különleges óvintézkedések nélkül egy rezidens program nem tudja meghívni a fordítókönyvtár számos funkcióját, mivel ez utóbbiak MS-DOS megszakításokat okoznak. Például a malloc függvény MS-DOS megszakítást okoz, hogy meghatározza a rendszerben lévő szabad memória mennyiségét.
Egy programnak két lehetősége van a memóriában való tartózkodásra - használja az INT 27h megszakítást vagy az INT 21h megszakítási funkciót 31h.
Az INT 27h megszakítás használatához a CS szegmensregiszternek a program PSP-jére kell mutatnia. Ebben az esetben a program utolsó bájtjának eltolását plusz egy bájtot kell a DX regiszterbe írni.
Könnyen belátható, hogy ez a módszer a legmegfelelőbb com-programokhoz, mivel az INT 27h megszakítással nem lehet 64 KB-nál hosszabb rezidens programot a memóriában hagyni.
Egy másik, kényelmesebb módja a 31h INT 21h megszakítási függvény meghívása. Az AL regiszter tartalmazza a programlezáró kódot, a DX regiszter a program rezidens részének hosszát bekezdésekben. A program méretére vonatkozóan már nem érvényes a fenti korlátozás.
Ha olyan programot szeretne a memóriában hagyni, amelynek mérete meghaladja a 64 KB-ot, csak az utolsó módszert használhatja. Nem szabad elragadtatni magát a nagy rezidens programokkal, mivel az általuk elfoglalt memóriára más programoknak szüksége van.
Először a memóriában tárolódnak az adatok, majd a megszakításkezelők (vektorok) és végül az inicializálási rész (amelynek INIT belépési pontja van, és ezen a ponton történik a vezérlés átvitele a program indításakor). Az inicializálási szakasz fő feladata egy rezidens létrehozása a memóriában (csak a program telepítésekor van rá szükség, majd eltávolítja a memóriából). Ez a rész a magasabb címeken található (mivel csak a magasabb címeket tudjuk "levágni").
A 27h megszakítás használatához a CS szegmensregiszternek a program PSP-jére kell mutatnia, és a program utolsó bájtjának eltolását plusz egy bájtot a DX regiszterbe kell írni. Könnyen belátható, hogy a rezidens maradásnak ez a módja a legmegfelelőbb a COM formátumú műsorokhoz. Nem hagyhat el 64 kilobájtnál hosszabb rezidens programot.
Egy másik, kényelmesebb módja az INT 21h megszakítási funkció 31h használata. Az AL regiszterben megadható a programlezáró kód, a DX regiszternek ebben az esetben a rezidens programrész hosszát bekezdésekben kell tartalmaznia. A program hosszában már nincs 64 kilobájt korlát. Ez a funkció az egyetlen módja annak, hogy elhagyjon egy 64 kilobájtnál hosszabb rezidens programot.
De nem szabad elragadtatni magát a hosszú TSR programokkal, mivel általában csak az operációs rendszer újraindításával szabadíthatja fel az amúgy is felesleges rezidens program által elfoglalt memóriát.
A Quick C függvénykönyvtár egy speciális funkciót tartalmaz, amellyel a program a memóriában marad. Ez a függvény az INT 21h-t (31h függvény) használja, és a neve _dos_keep(). A függvény első paramétere a kilépési kód (amit az AL regiszterbe írunk), a második pedig a program rezidens részének hossza bekezdésekben.
Meg kell határozni, hogy a TSR elindult-e vagy sem. Számos lehetőség van a TSR kezdetének meghatározására:
Előnyök: Széleskörű használat. Hátránya: az aláíráskészlet meglehetősen korlátozott (az aláírás véletlenül egyezhet). A megbízhatóság kisebb, mint a 2. módszeré.
Ha egy rezidens programot telepít a memóriába, a vektorok elfogják. Ebben az esetben a következő interakciós sémák lehetségesek a régi és az új megszakításkezelő között:
A visszaküldés a régi kezelőtől származik. Van egy lánc a megszakításkezelők között. Hátrány: Gyakran szükséges, hogy új funkciókat hajtsanak végre a régiek után. Ez a séma nem lehetséges.
Az új ISR-ek kölcsönhatásától függően különböző összetettségi szinteket különböztetnek meg.
Ha megnézi a BIOS funkcióit futás közben, észre fogja venni, hogy nem reentrant, ez az INT 13 lemezzel és az INT 10 képernyővel való munkavégzés funkcióira vonatkozik. A Reentrance egy olyan tulajdonság, amely lehetővé teszi egy program vagy valamilyen töredék használatát. megszakítandó és elindítva (újra) végrehajtandó. Vagyis a program megszakíthatja önmagát. Hogy. A BIOS-funkciók nem lépnek be újra. Klasszikusan új INT 13-as kezelőt kell írni, a rezidens függvényt hívjuk meg, amikor egy billentyűt lenyomunk, majd az INT 9 billentyűzet megszakításkezelőt kell használni, aminek ellenőriznie kell a jelzőt: a lemez feldolgozás alatt áll vagy nem . Ha a jelző nulla, akkor az RF programunk (ami az INT 13-mal működik) hívható. A védelem csak az INT 13 megszakítása ellen készült, mivel a többi megszakítás DOS-funkciókat használ.
Ezek olyan programok, ahol a rezidens függvény DOS függvényeket használ (pl. az RF az INT 21-et). Az INT 21 nem jelentkezik újra. Ezt a problémát ugyanúgy meg lehetne oldani, mint az INT 13-mal. Ez a módszer azonban nem működik, mivel a DOS-függvények nem mindig rendelkeznek szabványos lezárással (vannak olyan kimenetek, amelyek nem vezérelhetők). Ezek közé tartozik a 4C és a 4B. Az OC-nak van egy speciális jelzője, a DOS-aktivitás jelzője, amelyet INDOS-nak hívnak. Ez a jelző 0, ha az INT 21 nem kerül végrehajtásra, és nem 0, ha igen. Hogy. a programban szükséges az INDOS elemzése. Van egy szabványos függvény az INDOS jelző beszerzéséhez, ez az int 21 megszakítás AH=34h, aminek eredménye az ES:BX -> inDOS. Ezt a funkciót 34h az inicializálási szakaszban kell végrehajtani. Rögzítenie kell ennek az INDOS jelzőnek a címét egy statikus memóriahelyen, majd használnia kell a megszakításkezelőkben.
Az 1. csoport végrehajtásakor lehetséges egy másik csoport funkcióinak ellátása, de az első csoport funkciói nem, és fordítva. Az 1. csoport funkcióinak végrehajtása során a rezidens funkció elindításának problémájának megoldására egy speciális INT 28 megszakítást használnak. A felhasználó elfoghatja az INT 28 vektort és végrehajthatja a megfelelő műveleteket (a 2. csoportból). Például a rezidens függvényünk csak a 2. függvénycsoportot használja. Ha a DOS aktív, akkor a TSR csak az INT 28-at hívja, és ha nem aktív, akkor csak az időzítőtől okoz megszakítást. A képernyőkimenet közvetlenül a kijelző RAM-jába történhet (a DOS és a BIOS megkerülésével). A billentyűzet használatához használja a BIOS funkcióit. A képernyővel és a billentyűzettel való munkához a 2. csoport funkcióit használjuk, de a képernyőt és a billentyűzetet CON-eszköznek tekintjük, és a vele végzett munka úgy történik, mint egy fájl.