Sunteți pe pagina 1din 27

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
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;
Salvarea adresei vechiului handler
 Prin acces direct la vectorul  Folosind functia DOS 35h:
de RTI:
oldint77 dd ? ; pt memorarea adresei vechii RTI
oldint77 dd ? ; pt memorarea adresei vechii RTI



mov es, 0 …
cli ; dezactiveaza intreruperile
mov ax, 3577h ; ES:BX – adresa handler curent
mov ax, word ptr es:[4*77h] int 21h
mov word ptr cs:oldint77, ax mov word ptr cs:oldint77, bx
mov ax, word ptr es:[4*77h+2] mov word ptr cs:[oldint77+2], es
mov word ptr cs:[oldint77+2], ax
sti ; reactiveaza intreruperile
Modificarea adresei handler-ului in
vectorul de adrese RTI
 Prin acces direct la vectorul de  Folosind functia DOS 25h:
RTI:
mov es, 0 push ds
cli mov ax, 2577h
mov word ptr es:[4*77h],offset Newhandler mov dx, seg Newhandler
mov word ptr es:[4*77h+2],seg Newhandler mov ds, dx
sti mov dx, offset Newhandler
int 21h
pop ds
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
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
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)
Harta de memorie DOS si
programele TSR (1)

Harta memoriei DOS dupa Harta memoriei DOS cu o


incarcare, fara aplicatii active aplicatie activa
Harta de memorie DOS si
programele TSR (2)

Harta memoriei DOS dupa Harta memoriei DOS dupa


terminarea unei aplicatii rezidente incarcarea unui TSR si a unei
aplicatii tranziente
Exemplu de redirectare a unei
intreruperi – declarare date in
partea rezidenta
assume cs:cod
cod segment
org 100h ; rezerv spatiu pt PSP
start:
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"
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
Exemplu de redirectare a unei
intreruperi – partea transienta
(verif. handler deja instalat)
instalare: ; ds:si contine adresa semnaturii
;verifica daca noua RTI nu a fost deja ; es:si contine adresa semnaturii din
instalata vechea rutina
mov ah,35h mov di,si
mov al,14h cld
int 21h mov cx,handler-semnatura
;in es:bx avem adresa rti14h repe cmpsb
jne neinstal
mov word ptr Vechiip,bx
mov ah,9h
mov word ptr Vechics,es
lea dx,minstalat
;compara adresele RTI si NOUA_RTI int 21h
cmp bx,offset handler ;terminare
jne neinstal mov ax,4c01h
;compara semnaturile int 21h
push cs
pop ds
lea si,semnatura
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 dx
cod ends ; paragrafe
end start
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
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
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
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
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
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).
Depanarea unui TSR (2)
Depanarea unui TSR (3)
Depanarea unui TSR (4)
Depanarea unui TSR (5)
Depanarea unui TSR (6)
Depanarea unui TSR (7)
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)

S-ar putea să vă placă și