Residentprogram

Ett resident program (eller TSR-program , från engelskan.  Terminate and Stay Resident  - "complete and remain resident") - i MS-DOS- operativsystemet , ett program som återförde kontrollen till operativsystemets skal ( command.com ) eller en tillägg till operativsystemet ( Norton Commander etc.), men kvar i RAM-minnet på en persondator [1] . Ett inbyggt program aktiveras varje gång ett avbrott inträffar , vars vektor har ändrats till adressen för en av dess procedurer .

När man arbetade med MS-DOS användes inhemska program i stor utsträckning för att uppnå olika mål (till exempel tangentbordsknäckare , LAN- åtkomstprogram , fördröjda utskriftshanterare , virus ).

Genom metoden för initiering och anrop av operativsystemet måste inhemska program särskiljas från "riktiga" MS-DOS- drivrutiner som är inbäddade av operativsystemet i dess kärna vid uppstart.

I en tid med multitasking OS kallas program som ständigt laddas och körs i bakgrunden ibland för residenta program. Men användningen av denna term är felaktig i förhållande till multitasking OS.

Grundläggande begrepp

Residentprogram kan ta över hanteringen av avbrott, till exempel sådana som är kopplade till utskrift eller åtkomst till tangentbordet etc.

Sådana program kördes vanligtvis genom filen AUTOEXEC.BAT eller direkt. De avlyssnade avbrott utformade för att fungera med tangentbordet. Så snart användaren trycker på en fördefinierad tangentkombination, aktiveras det inhemska programmet. En dialogruta för det residenta programmet visas ovanpå bilden på skärmen.

Ibland används inbyggda program istället för nedladdningsbara drivrutiner för att serva icke-standardiserad hårdvara. I det här fallet kan det inhemska programmet bädda in sin egen hanterare, genom vilken alla applikationsprogram kan komma åt hårdvaran.

De inbyggda modulerna i vissa databashanteringssystem ( DBMS ) fungerar på liknande sätt. Applikationsprogrammet skickar frågor till databasen genom ett avbrott som ställs in när ett sådant DBMS startas.

Många begränsningar införs för inhemska program som gör det svårt för en programmerare att arbeta.

Till exempel är TSR:er inte tillåtna att använda MS-DOS-avbrott efter behag. Detta beror på att MS-DOS designades från början som ett operativsystem med en enda uppgift, så MS-DOS-avbrottsfunktioner är inte återkommande.

Låt oss föreställa oss en sådan situation.

Antag att ett vanligt program som kallas någon MS-DOS-avbrottsfunktion som tar relativt lång tid att slutföra (till exempel skriva till disk).

Eftersom användaren kan aktivera residentprogrammet när som helst, om inte särskilda försiktighetsåtgärder vidtas, är det möjligt att anropa samma funktion igen, vars bearbetning ännu inte har slutförts. I det här fallet kommer vi att få ett MS-DOS-funktionsåteranrop, vilket är ogiltigt på grund av att MS-DOS-funktioner inte återkommer.

BIOS- funktioner är inte heller alla återkommande . Ett inbyggt program kan säkert bara anropa INT 16h-avbrottet (som är utformat för att fungera med tangentbordet). Om det inhemska programmet behöver visa något på skärmen, bör du istället för att avbryta INT 10h skriva tecknen och deras attribut direkt till videominnet.

Utan att vidta särskilda försiktighetsåtgärder kan ett inbyggt program inte anropa många funktioner i översättarbiblioteket, eftersom de senare orsakar MS-DOS-avbrott. Till exempel orsakar malloc- funktionen ett MS-DOS-avbrott för att fastställa mängden ledigt minne i systemet.

Ett program har två alternativ för att stanna kvar i minnet - använd INT 27h interrupt eller INT 21h interrupt funktion 31h.

För att använda INT 27h-avbrottet måste CS-segmentregistret peka på programmets PSP. I detta fall bör förskjutningen av programmets sista byte plus en byte skrivas till DX-registret.

Det är lätt att se att denna metod är mest lämpad för com-program, eftersom det är omöjligt att lämna ett inbyggt program som är längre än 64 KB i minnet med hjälp av INT 27h-avbrottet.

Ett annat, bekvämare sätt är att anropa avbrottsfunktionen 31h INT 21h . AL-registret bör innehålla programavslutningskoden, DX-registret bör innehålla längden på den inhemska delen av programmet i paragrafer. Det finns inte längre ovanstående begränsning för programmets storlek.

För att lämna ett program kvar i minnet, vars storlek överstiger 64 KB, kan du bara använda den sista metoden. Du bör inte ryckas med med stora inbyggda program, eftersom minnet de upptar behövs av andra program.

Invånarprogrammets struktur

Först lagras data i minnet, sedan avbrottshanterare (vektorer) och slutligen initialiseringssektionen (som har en INIT-ingångspunkt och det är vid denna punkt som kontrollen överförs när programmet startar). Huvuduppgiften för initieringssektionen är att etablera en invånare i minnet (det behövs bara när du installerar programmet, sedan tas det bort från minnet). Denna sektion ligger i de högre adresserna (eftersom vi bara kan "klippa av" de högre adresserna).

Funktionerna för initieringssektionen är som följer

  1. Avbrottsvektorer fångas upp (ställer in deras hanterare).
  2. Programmet avslutas på ett sådant sätt att endast den boende delen finns kvar i minnet.
  3. Skicka parametrar för att avbryta hanterare - ISR. Värdena för dessa parametrar placeras i det invånare dataområdet (parametern kan vara en "snabb"-knapp för att anropa invånaren).
  4. Lösningen på problemet med att starta om TSR (inte för att multiplicera kopior av TSR i minnet), det vill säga initialiseringssektionen måste avgöra om det finns ett program i minnet eller inte.
  5. Ta bort en invånare från minnet. För det första, återställ de gamla avbrottsvektorerna (från datasektionen), och för det andra, ta bort TSR-miljön och PSP TSR.
  6. Funktion för att minimera minnet som upptas av den boende.

Initiering av invånarprogrammet

För att använda avbrott 27h måste segmentregistret CS peka på programmets PSP, och förskjutningen av programmets sista byte plus en byte måste skrivas till DX-registret. Det är lätt att se att det här sättet att stanna kvar är bäst lämpat för program i COM-format. Du kan inte lämna ett inbyggt program som är längre än 64 kilobyte.

Ett annat, mer bekvämt sätt är att använda INT 21h avbrottsfunktionen 31h. I AL-registret kan du ange programavslutningskoden, DX-registret bör i detta fall innehålla längden på den inhemska delen av programmet i paragrafer. Det finns inte längre en gräns på 64 kilobyte för programmets längd. Att använda denna funktion är det enda sättet att lämna ett inbyggt program som är längre än 64 kilobyte.

Men du bör inte ryckas med med långa TSR-program, eftersom du vanligtvis kan frigöra minnet som upptas av ett redan onödigt inbyggt program endast genom att starta om operativsystemet.

Funktionsbiblioteket Quick C innehåller en speciell funktion för att lämna ett program kvar i minnet. Denna funktion använder INT 21h (funktion 31h) och heter _dos_keep(). Den första parametern för funktionen är utgångskoden (det som skrivs till AL-registret), och den andra är längden på den inhemska delen av programmet i stycken.

Löser omstartsproblemet

Det är nödvändigt att avgöra om TSR redan har startat eller inte. Det finns flera alternativ för att bestämma början av TSR:

MOVAX,2ABCh INT2Fh CMP AL,0FFh; om lika, så finns det en kopia, annars finns det ingen kopia.

Fördelar: Bred användning. Nackdel: signaturuppsättningen är ganska begränsad (signaturen kan av misstag matcha). Tillförlitligheten är mindre än den för den andra metoden.

Interaktion mellan nya och gamla avbrottshanterare (ISR)

När ett inbyggt program är installerat i minnet fångas vektorer upp. I det här fallet är följande interaktionsscheman möjliga mellan gamla och nya avbrottshanterare:

Returen är från den gamla föraren. Det finns en kedja mellan avbrottshanterare. Nackdel: Det är ofta nödvändigt att nya funktioner exekveras efter gamla. Detta schema är inte möjligt.

TSR-komplexitetsnivåer och hur nya ISR:er interagerar med varandra

Beroende på interaktionen mellan nya ISR:er särskiljs olika nivåer av komplexitet.

Om du tittar på BIOS-funktionerna medan de körs kommer du att märka att de inte är reentrant, detta syftar på funktionerna för att arbeta med disken INT 13 och skärmen INT 10. Reentrance är en egenskap som tillåter ett program eller något fragment av det som ska avbrytas och köras med startat (igen). Det vill säga att programmet kan avbryta sig själv. Den där. BIOS-funktioner är inte återkommande. Klassiskt kommer du behöva skriva en ny INT 13-hanterare. Låt residentfunktionen anropas när en tangent trycks ned, sedan måste du använda INT 9-tangentbordsavbrottshanteraren, som ska kontrollera flaggan: disken bearbetas eller inte . Om flaggan är noll kan vårt RF-program (som fungerar med INT 13) anropas. Skydd görs endast mot INT 13-avbrottet, eftersom resten av avbrotten använder DOS-funktioner.

Detta är program där den residenta funktionen använder DOS-funktioner (t.ex. RF använder INT 21). INT 21 är inte återkommande. Det skulle vara möjligt att lösa detta problem på samma sätt som med INT 13. Men denna metod fungerar inte, eftersom DOS-funktioner inte alltid har standardterminering (det finns vissa utgångar som inte kan styras). Dessa funktioner inkluderar 4C och 4B. OC har en speciell flagga som kallas DOS-aktivitetsflaggan, som kallas INDOS. Denna flagga är 0 om INT 21 inte exekveras, och inte 0 om den är det. Den där. i programmet är det nödvändigt att analysera INDOS. Det finns en standardfunktion för att få INDOS-flaggan, detta är AH=34h av avbrott int 21. Denna funktion resulterar i ES:BX -> inDOS. Denna funktion 34h måste utföras i initialiseringssektionen. Måste fixa adressen för denna INDOS-flagga på en statisk minnesplats och sedan använda den i avbrottshanterare.

När den första gruppen exekveras är det möjligt att utföra funktionerna för en annan grupp, men inte den första, och vice versa. För att lösa problemet med att starta en resident funktion vid tidpunkten för exekvering av de 1:a gruppfunktionerna används ett speciellt avbrott INT 28. Användaren kan avlyssna vektorn INT 28 och utföra lämpliga åtgärder (från den 2:a gruppen). Låt till exempel vår residentfunktion endast använda den 2:a gruppen av funktioner. Om DOS är aktivt, anropar TSR endast INT 28, och om det inte är aktivt, orsakar det avbrott endast från timern. Skärmutgång kan göras direkt till displayens RAM (förbigå DOS och BIOS). För att arbeta med tangentbordet, använd BIOS-funktionerna. För att arbeta med skärmen och tangentbordet används funktionerna i den andra gruppen, men skärmen och tangentbordet betraktas som en CON-enhet och arbetet med det utförs som med en fil.

Se även

Anteckningar

  1. © Alexander Frolov, Grigory Frolov. MS-DOS för programmeraren . frolov-lib . Hämtad 9 maj 2022. Arkiverad från originalet 1 december 2020.