Redirectarea intreruperilor

27
Redirectarea intreruperilor

description

Redirectarea intreruperilor. Rezumat. Ce presupune redirectarea intreruperilor ? Programe TSR Exemplu de program de redirectare a unei intreruperi Problema functiilor DOS non reentrante Problema intreruperilor BIOS non reentrante Intreruperea multiplex (INT 2Fh) - PowerPoint PPT Presentation

Transcript of Redirectarea intreruperilor

Page 1: Redirectarea intreruperilor

Redirectarea intreruperilor

Page 2: Redirectarea intreruperilor

Rezumat

Ce presupune redirectarea intreruperilor ? Programe TSR Exemplu de program de redirectare a unei

intreruperi Problema functiilor DOS non reentrante Problema intreruperilor BIOS non reentrante Intreruperea multiplex (INT 2Fh) Instalarea si dezintlarea unui TSR Depanarea unui TSR Dificultati redirectare intreruperi in Windows

Page 3: Redirectarea intreruperilor

Ce inseamna redirectarea intreruperilor ?

MS-DOS pune in memorie la adresa 0000:0000 vectorul adreselor FAR a RTI-urilor (Rutina de Tratare a Intreruperii, handler)

Scopul redirectarii unei intreruperi: implementarea unei functionalitati ce lipseste din cadrul SO-ului, optimizarea unor rutine BIOS sau DOS, alterarea comportamentului SO-ului

Pasii necesari redirectarii unei intreruperi:1) Scrierea noii RTI (noul handler);2) Salvarea adresei vechiului handler (cel original);3) Modificarea adresei handler-ului in vectorul de adrese a

RTI-urilor;4) Apelarea noului RTI;5) Eventual, apelarea vechii RTI;6) Restaurarea handler-ului original;

Page 4: Redirectarea intreruperilor

Salvarea adresei vechiului handler Prin acces direct la vectorul

de RTI:oldint77 dd ? ; pt memorarea adresei vechii

RTI

……mov es, 0cli ; dezactiveaza intreruperile

mov ax, word ptr es:[4*77h]mov word ptr cs:oldint77, axmov ax, word ptr es:[4*77h+2]mov word ptr cs:[oldint77+2], axsti ; reactiveaza intreruperile

Folosind functia DOS 35h:

oldint77 dd ? ; pt memorarea adresei vechii RTI

…mov ax, 3577h ; ES:BX – adresa handler

curent

int 21h

mov word ptr cs:oldint77, bx

mov word ptr cs:[oldint77+2], es

Page 5: Redirectarea intreruperilor

Modificarea adresei handler-ului in vectorul de adrese RTI

Prin acces direct la vectorul de RTI:

mov es, 0

cli

mov word ptr es:[4*77h],offset Newhandler

mov word ptr es:[4*77h+2],seg Newhandler

sti

Folosind functia DOS 25h:

push ds

mov ax, 2577h

mov dx, seg Newhandler

mov ds, dx

mov dx, offset Newhandler

int 21h

pop ds

Page 6: Redirectarea intreruperilor

Apelarea RTI original si revenirea din RTI

Apelarea vechii RTI cu revenirea in noua RTI:pushf ; punerea flagurilor pe stiva

call dword ptr cs:oldint77

iret ; popf + retf

Apelarea vechii RTI cu revenirea in aplicatie:jmp dword ptr cs:oldint77

Page 7: Redirectarea intreruperilor

Scrierea noii RTI

Nu ne putem baza pe valoarea nici unui registru in afara de CS si IP

Daca modificam registrii in interiorul noii RTI, valorile acestora trebuie salvate in prealabil si restaurate inainte de revenirea din noua RTI

Page 8: Redirectarea intreruperilor

Programe TSR (Terminate and Stay Resident)

Programele MS-DOS pot fi: Tranziente : elibereaza memoria dupa terminare Rezidente: tin ocupata o parte din memorie dupa

terminare TSR-urile se folosesc pt. a introduce facilitati

multitasking in cadrul unui SO monotask Ramanerea rezidenta se realizeaza cu ajutorul

functiei DOS 31h Programele TSR au o sectiune tranzienta (se

executa o singura data, la inceput) si una rezidenta (ramane in memorie)

TSR-uri active (activate de intreruperi hardware generate de sistem)

TSR-uri pasive (activate printr-un call explicit)

Page 9: Redirectarea intreruperilor

Harta de memorie DOS si programele TSR (1)

Harta memoriei DOS dupa incarcare, fara aplicatii active

Harta memoriei DOS cu o aplicatie activa

Page 10: Redirectarea intreruperilor

Harta de memorie DOS si programele TSR (2)

Harta memoriei DOS dupa terminarea unei aplicatii rezidente

Harta memoriei DOS dupa incarcarea unui TSR si a unei aplicatii tranziente

Page 11: Redirectarea intreruperilor

Exemplu de redirectare a unei intreruperi – declarare date in partea rezidenta

assume cs:codcod segment org 100h ; rezerv spatiu pt PSPstart: jmp instalare ;partea rezidenta mesaj db "S-au initializat parametrii pentru COM1 ! $" minstalat db "Rutina a fost deja instalata $" Vechiip dw ? Vechics dw ? semnatura db “exemplu rutina"

Page 12: Redirectarea intreruperilor

Exemplu de redirectare a unei intreruperi – noul handler

handler: ;****RUTINA PROPRIE**** cmp ah,00h jnz ApelVecheaRutina ; daca functia nu e 00h, apelam vechea rutina push ax push ds push dx ; salvam registrii pe care urmeaza sa-i modificam mov ah,9h push cs pop ds lea dx,mesaj int 21h ; afisam mesaj ;dezinstalare noua rutina ;mov ax,2514h ;mov dx,word ptr Vechiip ;mov ds,word ptr Vechics pop dx pop ds pop ax ; restauram registrii iret ; interrupt return

ApelVecheaRutina: jmp dword ptr Vechiip ; salt la vechea rutina cu revenire in aplicatie

Page 13: Redirectarea intreruperilor

Exemplu de redirectare a unei intreruperi – partea transienta (verif. handler deja instalat)

instalare: ;verifica daca noua RTI nu a fost deja instalata mov ah,35h mov al,14h int 21h ;in es:bx avem adresa rti14h mov word ptr Vechiip,bx mov word ptr Vechics,es ;compara adresele RTI si NOUA_RTI cmp bx,offset handler jne neinstal ;compara semnaturile push cs pop ds lea si,semnatura

; ds:si contine adresa semnaturii; es:si contine adresa semnaturii din vechea rutina mov di,si cld mov cx,handler-semnatura repe cmpsb jne neinstal mov ah,9h lea dx,minstalat int 21h ;terminare mov ax,4c01h int 21h

Page 14: Redirectarea intreruperilor

Exemplu de redirectare a unei intreruperi – instalarea partii rezidente

neinstal: mov ah,25h mov al,14h push cs pop ds lea dx,handler int 21h ; instalam noul handler mov ah,31h mov al,00h lea dx,instalare add dx,15 mov cl,4 shr dx,cl int 21h ; terminam programul si lasam rezidente dxcod ends ; paragrafeend start

Page 15: Redirectarea intreruperilor

Pasi necesari/optionali in redirectarea intreruperilor

Pasii algoritmului de redirectare a unei intreruperi: scrierea noului handler

• apelarea in noul handler a vechiului handler (optional)• dezinstalarea noului handler dupa prima rulare (optional)

salvarea adresei vechiului handler, functia 35h (optional) verificare handler deja instalat (optional) instalare noul handler, functia 25h terminare program cu ramanerea rezidenta a handlerului,

functia 31h

Page 16: Redirectarea intreruperilor

Problema functiilor DOS non reentrante

Apare cand aplicatia curenta a apelat o functie DOS si in timpul executiei functiei DOS are loc un eveniment asincron (ex. intreruperea de ceas, apasarea unei taste) care activeaza un TSR care la randul lui vrea sa apeleze o functie DOS

DOS nu este reentrant: nu permite ca mai multe apeluri DOS sa fie activate in acelasi timp

Poate duce la blocarea sistemului In general, problema nu apare la TSR-uri pasive Flag InDOS pe 1 octet(=0 daca nu este activ un apel DOS, !=0

daca un apel DOS este in progress) + functia DOS 34h (GetInDosFlagAddress)

Flag CritError – setat cand un apel DOS se termina cu eroare critica; detaliile erorii sunt salvate la o adresa fixa, suprascrisa de fiecare data

Page 17: Redirectarea intreruperilor

Problema intreruperilor BIOS non reentrante

Unele functii ale intreruperilor BIOS sunt non-reentrante, dar multe altele sunt reentrante

BIOS nu furnizeaza un flag InBIOS Pt. intreruperile BIOS non-reentrante se pot

implementa wrapper-i care sa simuleze flagul InBIOS:int17 proc far

inc CS:InBIOS

pushf

call dword ptr CS:OldInt17

dec CS:InBIOS

iret

int17 endp

Page 18: Redirectarea intreruperilor

Intreruperea multiplex (INT 2Fh)

Cand instalam un TSR pasiv trebuie sa alegem un nr. de intrerupere pe care sa o redirectam: Putem alege la intamplare o adresa din vectorul

adreselor RTI Putem alege o intrerupere care implementeaza o

functie specifica Putem alege intreruperea multiplex 2Fh

Intreruperea multiplex 2Fh: rezervata pt a furniza un mecanism general de instalare, testarea prezentei si comunicare cu un TSR

Page 19: Redirectarea intreruperilor

Instalarea si dezinstalarea unui TSR De verificat la instalare:

Sa nu fie deja instalata rutina (cu ajutorul unei semnaturi)

Nr.-ul intreruperii pe care TSR-ul nostru o redirecteaza sa fie liber

De efectuat la dezinstalare: Oprirea tuturor activitatilor in curs ale programului TSR Refacerea tuturor vectorilor de intreruperi modificati de

RTI Dealocarea memoriei ocupare de partea rezidenta

[Ultimele doua sarcini dificil de realizat] Exemplificarea celor prezentate anterior:

exemplul “TSR Monitor Tastatura”, sectiunea 6.8, pag. 229, cartea albastra

Page 20: Redirectarea intreruperilor

Depanarea unui TSR (1) Compileaza si linkediteaza programul TSR (eventual cu

informatii de debug complete). Se incarca TSR-ul in TD si se executa portiunea tranzienta

in mod normal. Cand aceasta portiune este gata de executat, portiunea rezidenta este instalata in RAM.

Se seteaza un punct de intrerupere la inceputul partii rezidente (sau oriunde in portiunea rezidenta) cu ajutorul tastei F2 (sau din meniul Breakpoints).

Se selecteaza optiunea File | Resident din meniu pentru a face ca TD insusi sa devina rezident. Aceasta se face pentru a reveni la prompterul de DOS.

Odata revenirea in DOS realizata, se activeaza portiunea rezidenta.

Cand executia programului ajunge la breakpoint, TD revine afisand TSR-ul in punctul respectiv. In continuare se poate depana aceasta portiune (Revenirea in TD din DOS se poate face si apasand CTRL-Break de doua ori).

Page 21: Redirectarea intreruperilor

Depanarea unui TSR (2)

Page 22: Redirectarea intreruperilor

Depanarea unui TSR (3)

Page 23: Redirectarea intreruperilor

Depanarea unui TSR (4)

Page 24: Redirectarea intreruperilor

Depanarea unui TSR (5)

Page 25: Redirectarea intreruperilor

Depanarea unui TSR (6)

Page 26: Redirectarea intreruperilor

Depanarea unui TSR (7)

Page 27: Redirectarea intreruperilor

Dificultati redirectare intreruperi in Windows

Nu mai exista sisteme cu MS-DOS nativ SO Windows emuleaza o arhitectura hardware

virtuala in care ruleaza SO DOS Nu putem redirecta unle intreruperi care

lucreaza cu echipament hardware deoarece acesta este virtual (ex. int 13h pt lucrul cu discul, int 10h pt lucrul in mod grafic etc)