Rezidens program

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.

Alapfogalmak

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.

A rezidens program felépítése

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").

Az inicializálási szakasz funkciói a következők

  1. A megszakítási vektorokat elfogja (beállítja a kezelőit).
  2. A program úgy ér véget, hogy csak a rezidens rész marad a memóriában.
  3. Paraméterek átadása megszakításkezelőknek - ISR. Ezeknek a paramétereknek az értékei a rezidens adatterületen kerülnek elhelyezésre (a paraméter lehet egy "hot" gomb a rezidens hívásához).
  4. A TSR újraindításának problémájának megoldása (a TSR másolatainak megsokszorozása a memóriában), vagyis az inicializálási szakasznak meg kell határoznia, hogy van-e program a memóriában vagy sem.
  5. Rezidens eltávolítása a memóriából. Először is állítsa vissza a régi megszakítási vektorokat (az adatrészből), másodszor pedig távolítsa el a TSR környezetet és a PSP TSR-t.
  6. A rezidens által elfoglalt memória minimalizálására szolgáló funkció.

A rezidens program inicializálása

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.

Az újraindítási probléma megoldása

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:

MOVAX,2ABCh INT2Fh CMP AL,0FFh; ha egyenlő, akkor van másolat, ellenkező esetben nincs másolat.

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é.

Új és régi megszakításkezelők (ISR-ek) kölcsönhatása

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.

A TSR bonyolultsági szintjei és az új ISR-ek kölcsönhatása egymással

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.

Lásd még

Jegyzetek

  1. © Alekszandr Frolov, Grigorij Frolov. MS-DOS a programozónak . frolov-lib . Letöltve: 2022. május 9. Az eredetiből archiválva : 2020. december 1.