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 PresentationTRANSCRIPT
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
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
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
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 incarcare, fara aplicatii active
Harta memoriei DOS cu o aplicatie activa
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
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"
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: ;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
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
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)