Sunteți pe pagina 1din 1

Implementarea se face in fisierul loader.

c
trebuie sa completezi minimal functia so_init()

in plus, trebuie sa implementezi un signal handler care intercepteaza doar


semnaelel SIGSEG
SIGNAL HANDLER-ul va furniza atunci cand se porneste semnalul si adresa din memoria
care a declansat eroare.
Acea adresa e utila pentru calculalea paginilor si etc.

In abordarea temei, pentru rezolvare, am urmarit pasii prezentati in enunt pentru a


determina daca adresa unui semnal capturat de handler face parte sau nu dintr-o
lista de cazuri precum:
a. Adresa invalida
b. Adresa valida dar cu permisiuni gresite
c. Trebuie sa mapam o pagina care este deja completa cu date
d. Trebuie sa mapam o pagina si sa citim din fisier datele aferente
d1. O pagina completa
d2. O pagina partiala ce poate contine date nule pana la 4096

Astfel, am calculat urmatoarele valori pentru a determina cazul in care ne aflam si


cum il tratam:
a. Vedem in ce segment se afla adresa semnalului comparand intervalul
(start_segment, sfarsit_segment) cu adresa semnalului. Daca aceasta se afla in
interval, am gasit segmentul
b. Daca in urma subpunctului anterior nu am gasit niciun segment cu
proprietatea ceruta, intoarcem Segmentation Fault
c. Calculam indicele paginii din segmentul gasit, facut diferenta intre
adresa semnalului si adresa de inceput as segmentului, impartita la
4096(dimensiunea unei pagini in memorie)
d. Daca pagina de la indicele calculat a fost deja mapata, semnalul s-a
generat datorita unor permisiuni gresite(exemplu: incercam sa scriem dar aveam doar
drept de cietire). In acest caz, intoarcem Segmentation Fault
e. Daca pagina are deja date in ea si trebuie doar mapata, apelam mmap,
calculand fd_address ca fiind bazat pe offsetul segmentului si deplasamentul
paginii
f. Altfel, trebuie, pe langa mmap, sa copiem din fisier datele aferente
paginii. Datele se vor copia la adresa paginii curente.
g. Daca totul a decurs bine pana acum(nu am intors deja Segmentation Fault),
apelam mprotect si setam permisiunile zonei alocate de mmap.
h. Setam pagina curenta ca fiind mapata.

Pentru tinerea evidentei paginilor daca au fost sau nu mapate, am folosit campul
data al structurii so_segment in care am stocat un vector de valori intregi, v[i] =
1 sau 0 daca pagina i din segmentul curent a fost sau nu mapata.

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