Resident-ohjelma (tai TSR-ohjelma , englanniksi. Terminate and Stay Resident - "täydennä ja pysy asukkaana") - MS-DOS- käyttöjärjestelmässä , ohjelma , joka palautti hallinnan käyttöjärjestelmän kuoreen ( command.com ) tai lisäosa käyttöjärjestelmään ( Norton Commander jne.), mutta jää henkilökohtaisen tietokoneen RAM -muistiin [1] . Resident-ohjelma aktivoituu aina, kun tapahtuu keskeytys , jonka vektori on muuttanut jonkin proseduurinsa osoitteeksi .
MS-DOS:n kanssa työskennellessä paikallisia ohjelmia käytettiin laajalti erilaisten tavoitteiden saavuttamiseksi (esimerkiksi näppäimistön krakkaukset, LAN - käyttöohjelmat , viivästyneet tulostushallintaohjelmat , virukset ).
Käyttöjärjestelmän alustus- ja kutsumenetelmällä pysyvät ohjelmat on erotettava "oikeista" MS-DOS- ajureista , jotka käyttöjärjestelmä upottaa ytimeensä käynnistyksen yhteydessä.
Moniajokäyttöjärjestelmän aikakaudella jatkuvasti latautuvia ja taustalla käynnissä olevia ohjelmia kutsutaan joskus vakituisiksi ohjelmiksi. Mutta tämän termin käyttö on väärin moniajokäyttöjärjestelmän suhteen.
Resident-ohjelmat voivat ottaa hoitaakseen keskeytykset, esimerkiksi ne, jotka liittyvät tulostamiseen tai näppäimistön käyttöön jne.
Tällaiset ohjelmat ajettiin yleensä AUTOEXEC.BAT -tiedoston kautta tai suoraan. He sieppasivat keskeytyksiä, jotka oli suunniteltu toimimaan näppäimistön kanssa. Heti kun käyttäjä painaa ennalta määritettyä näppäinyhdistelmää, pysyvä ohjelma aktivoituu. Resident-ohjelman valintaikkuna näytetään kuvan päällä näytöllä.
Joskus ohjelmia käytetään ladattavien ohjaimien sijasta epästandardin laitteiston huoltoon. Tässä tapauksessa pysyvä ohjelma voi upottaa oman käsittelijän, jonka kautta kaikki sovellusohjelmat pääsevät käsiksi laitteistoon.
Joidenkin tietokannanhallintajärjestelmien ( DBMS ) pysyvät moduulit toimivat samalla tavalla. Sovellusohjelma lähettää kyselyitä tietokantaan keskeytyksen kautta, joka asetetaan tällaisen DBMS:n käynnistyksen yhteydessä.
Paikallisille ohjelmille on asetettu lukuisia rajoituksia, jotka vaikeuttavat ohjelmoijan työtä.
Esimerkiksi TSR:t eivät saa käyttää MS-DOS-keskeytyksiä halutessaan. Tämä johtuu siitä, että MS-DOS suunniteltiin alusta alkaen yksitehtäväksi käyttöjärjestelmäksi, joten MS-DOS-keskeytystoiminnot eivät palaudu.
Kuvitellaanpa tällainen tilanne.
Oletetaan, että normaali ohjelma nimeltä MS-DOS-keskeytystoiminto, jonka suorittaminen kestää suhteellisen kauan (esimerkiksi levylle kirjoittaminen).
Koska käyttäjä voi aktivoida resident-ohjelman milloin tahansa, ellei erityisiin varotoimiin ryhdytä, on mahdollista kutsua uudelleen sama toiminto, jonka käsittelyä ei ole vielä suoritettu loppuun. Tässä tapauksessa saamme MS-DOS-funktion takaisinkutsun, joka on virheellinen, koska MS-DOS-funktiot eivät palaa takaisin.
BIOS - toiminnot eivät myöskään ole kaikki palaavia . Resident-ohjelma voi turvallisesti kutsua vain INT 16h -keskeytystä (joka on suunniteltu toimimaan näppäimistön kanssa). Jos pysyvän ohjelman on näytettävä jotain näytöllä, niin INT 10h:n keskeyttämisen sijaan kannattaa kirjoittaa merkit ja niiden attribuutit suoraan videomuistiin.
Ilman erityisiä varotoimia pysyvä ohjelma ei voi kutsua monia kääntäjäkirjaston toimintoja, koska viimeksi mainitut aiheuttavat MS-DOS-keskeytyksiä. Esimerkiksi malloc - funktio aiheuttaa MS-DOS-keskeytyksen, joka määrittää järjestelmän vapaan muistin määrän.
Ohjelmalla on kaksi vaihtoehtoa pysyä muistissa - käyttää INT 27h keskeytystä tai INT 21h keskeytystoimintoa 31h.
Jotta INT 27h -keskeytystä voidaan käyttää, CS-segmenttirekisterin on osoitettava ohjelman PSP:hen. Tässä tapauksessa ohjelman viimeisen tavun siirtymä plus yksi tavu tulee kirjoittaa DX-rekisteriin.
On helppo nähdä, että tämä menetelmä soveltuu parhaiten com-ohjelmille, koska INT 27h -keskeytystä käyttämällä on mahdotonta jättää muistiin yli 64 KB:n pituista pysyvää ohjelmaa.
Toinen, kätevämpi tapa on kutsua keskeytystoimintoa 31h INT 21h . AL-rekisterin tulee sisältää ohjelman lopetuskoodi, DX-rekisterin tulee sisältää ohjelman pysyvän osan pituus kappaleissa. Ohjelman kokoa ei enää rajoiteta.
Jos haluat jättää muistiin ohjelman, jonka koko on yli 64 kt, voit käyttää vain viimeistä menetelmää. Sinun ei pidä hukata suuriin paikallisiin ohjelmiin, koska niiden käyttämää muistia tarvitsevat muut ohjelmat.
Ensin tiedot tallennetaan muistiin, sitten keskeytyskäsittelijät (vektorit) ja lopuksi alustusosio (jossa on INIT-sisääntulopiste ja juuri tässä vaiheessa ohjaus siirtyy ohjelman käynnistyessä). Alustusosan päätehtävä on perustaa asukas muistiin (se tarvitaan vain ohjelmaa asennettaessa, sitten se poistetaan muistista). Tämä osio sijaitsee korkeammissa osoitteissa (koska voimme vain "leikata" korkeammat osoitteet).
Keskeytyksen 27h käyttämiseksi segmenttirekisterin CS on osoitettava ohjelman PSP:tä ja ohjelman viimeisen tavun offset plus yksi tavu on kirjoitettava DX-rekisteriin. On helppo nähdä, että tämä tapa pysyä asunnossa sopii parhaiten COM-muodossa oleville ohjelmille. Et voi poistua pysyvästä ohjelmasta, joka on yli 64 kilotavua.
Toinen, kätevämpi tapa on käyttää INT 21h keskeytystoimintoa 31h. AL-rekisterissä voit määrittää ohjelman lopetuskoodin, DX-rekisterin tulee tässä tapauksessa sisältää ohjelman pysyvän osan pituus kappaleina. Ohjelman pituudella ei ole enää 64 kilotavun rajaa. Tämän toiminnon käyttäminen on ainoa tapa poistua pysyvästä ohjelmasta, joka on yli 64 kilotavua.
Mutta pitkiin TSR-ohjelmiin ei pidä hukata, koska yleensä jo tarpeettoman pysyvän ohjelman varaama muisti voidaan vapauttaa vain käynnistämällä käyttöjärjestelmä uudelleen.
Quick C -funktiokirjasto sisältää erikoistoiminnon ohjelman jättämiseksi muistiin. Tämä funktio käyttää INT 21h (funktio 31h) ja sen nimi on _dos_keep(). Funktion ensimmäinen parametri on poistumiskoodi (mikä kirjoitetaan AL-rekisteriin) ja toinen on ohjelman pysyvän osan pituus kappaleissa.
On tarpeen määrittää, onko TSR jo alkanut vai ei. TSR:n alkamisen määrittämiseen on useita vaihtoehtoja:
Plussat: Laaja käyttö. Haitta: allekirjoitusjoukko on melko rajallinen (allekirjoitus voi vahingossa täsmää). Luotettavuus on pienempi kuin 2. menetelmällä.
Kun pysyvä ohjelma asennetaan muistiin, vektorit siepataan. Tässä tapauksessa seuraavat vuorovaikutusmallit ovat mahdollisia vanhan ja uuden keskeytyskäsittelijän välillä:
Palautus tulee vanhalta ohjaajalta. Keskeytyskäsittelijöiden välillä on ketju. Haitta: Usein on välttämätöntä suorittaa uusia toimintoja vanhojen jälkeen. Tämä järjestelmä ei ole mahdollinen.
Uusien ISR:ien vuorovaikutuksesta riippuen erotetaan eri monimutkaisuustasoja.
Jos katsot BIOSin toimintoja niiden ollessa käynnissä, huomaat, että ne eivät ole reentrant, tämä viittaa levyn INT 13 ja näytön INT 10 kanssa työskentelyyn. Reentrance on ominaisuus, joka sallii ohjelman tai jonkin fragmentin se keskeytetään ja suoritetaan aloituksella (uudelleen). Eli ohjelma voi keskeyttää itsensä. Että. BIOS-toiminnot eivät ole palautuvia. Perinteisesti sinun on kirjoitettava uusi INT 13 -käsittelijä. Anna resident-funktion kutsua kun näppäintä painetaan, sitten sinun on käytettävä INT 9 -näppäimistön keskeytyskäsittelijää, jonka pitäisi tarkistaa lippu: levyä käsitellään vai ei . Jos lippu on nolla, RF-ohjelmamme (joka toimii INT 13:n kanssa) voidaan kutsua. Suojaus on tehty vain INT 13 -keskeytystä vastaan, koska muut keskeytykset käyttävät DOS-toimintoja.
Nämä ovat ohjelmia, joissa pysyvä toiminto käyttää DOS-toimintoja (esim. RF käyttää INT 21:tä). INT 21 ei ole palaava. Tämä ongelma olisi mahdollista ratkaista samalla tavalla kuin INT 13:lla. Tämä menetelmä ei kuitenkaan toimi, koska DOS-toiminnoissa ei aina ole standardipäätettä (joitakin lähtöjä ei voi ohjata). Näitä ominaisuuksia ovat 4C ja 4B. OC:ssa on erityinen lippu nimeltä DOS-aktiviteettilippu, jota kutsutaan nimellä INDOS. Tämä lippu on 0, jos INT 21:tä ei suoriteta, eikä 0, jos se on. Että. ohjelmassa on tarpeen analysoida INDOS. INDOS-lipun saamiseen on olemassa vakiotoiminto, joka on AH=34h int 21 -keskeytyksestä.Tämä toiminto johtaa ES:BX -> inDOS. Tämä toiminto 34h on suoritettava alustusosassa. On korjattava tämän INDOS-lipun osoite staattiseen muistipaikkaan ja käytettävä sitä sitten keskeytyskäsittelijöissä.
Kun ensimmäinen ryhmä suoritetaan, on mahdollista suorittaa toisen ryhmän toimintoja, mutta ei ensimmäisen, ja päinvastoin. Ongelman ratkaisemiseksi, joka liittyy pysyvän toiminnon käynnistämiseen 1. ryhmän toimintojen suoritushetkellä, käytetään erityistä keskeytystä INT 28. Käyttäjä voi siepata INT 28 -vektorin ja suorittaa tarvittavat toimenpiteet (toisesta ryhmästä). Esimerkiksi, anna asukasfunktiomme käyttää vain toista funktioryhmää. Jos DOS on aktiivinen, TSR kutsuu vain INT 28:aa ja jos ei ole aktiivinen, se aiheuttaa keskeytyksiä vain ajastimesta. Näytön tulostus voidaan tehdä suoraan näytön RAM-muistiin (ohitamalla DOS ja BIOS). Käytä BIOS-toimintoja käyttääksesi näppäimistöä. Näytön ja näppäimistön kanssa työskentelyyn käytetään 2. ryhmän toimintoja, mutta näyttöä ja näppäimistöä pidetään CON-laitteena ja sen kanssa työskennellään kuten tiedostolla.