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