270 likes | 357 Views
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)
E N D
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: • Scrierea noii RTI (noul handler); • Salvarea adresei vechiului handler (cel original); • Modificarea adresei handler-ului in vectorul de adrese a RTI-urilor; • Apelarea noului RTI; • Eventual, apelarea vechii RTI; • Restaurarea handler-ului original;
Prin acces direct la vectorul de RTI: oldint77 dd ? ; pt memorarea adresei vechii RTI … … mov es, 0 cli ; dezactiveaza intreruperile mov ax, word ptr es:[4*77h] mov word ptr cs:oldint77, ax mov ax, word ptr es:[4*77h+2] mov word ptr cs:[oldint77+2], ax sti ; 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 Salvarea adresei vechiului handler
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 Modificarea adresei handler-ului in vectorul de adrese RTI
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 incarcarea unui TSR si a unei aplicatii tranziente Harta memoriei DOS dupa terminarea unei aplicatii rezidente
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) ; 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 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
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).
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)