[so] [Tema 3] Nelamurire enunt
Andrei Bucur
andrei.bucur at gmail.com
Thu Apr 30 18:56:29 EEST 2009
Am spus ca nu vad posibilitatea simularii memorie virtuale folosind maparea
intregului fisier de RAM intr-o bucata continua de memorie. Initial am dedus
ca asta trebuie sa facem din indiciile oferite in enunt (e.g. "ram_sync va
fi implementată folosind un apel msync. "; "un" apel, nu mai multe pentru
fiecare pagina). Implementarea mea curenta "rezerva"(folosind mmap anonim cu
acces PROT_NONE) virt_pages pagini in memorie iar adresa obtinuta este apoi
intoarsa de functia vinit. Exista 3 situatii in care poate aparea SEGFAULT:
1. Exista pagini fizice nemapate si pagina virtuala nu se afla in RAM: aleg
prima pagina din RAM nemapata si o mapez in zona de memorie rezervata la
inceput in locul in care a aparut SEGFAULT.
2. Nu mai exista pagini de memorie nemapate si pagina virtuala nu se afla in
RAM: aleg prima pagina din RAM mapata in memoria virtuala, o copiez in swap
daca e dirty, o demapez, rezerv vechea zona de memorie (ca nu cumva sa o
foloseasca altcineva), remapez pagina de RAM in locul unde a aparut
SEGFAULT.
3. Pagina se afla in RAM dar are doar PROT_READ: setez flagul dirty si ii
dau dreptul PROT_WRITE.
Toate testele par sa treaca cu brio. O pagina se va afla la un momentt dat
ori in RAM ori in SWAP. Implicit am limitat folosirea memcpy numai cand
faceam transferul din RAM in SWAP si viceversa.
Mai ramane o intrebare... este valida solutia?
2009/4/30 Mircea Bardac <cs at mircea.bardac.net>
> Sergiu Iordache wrote:
> > 2009/4/21 Andrei Bucur <andrei.bucur at gmail.com>:
> >> Eu ma gandesc ca tema trebuie structurata in modul urmator:
> >> 1. virt_pages pagini mapate peste RAM-ul fizic;
> >> 2. phys_pages pagini mapate peste fisierul RAM;
> >> 3. virt_pages pagini mapate peste fisierul SWAP.
> >> Accesul la memoria simulata se va face strict prin (1). Fiecare pagina
> va fi
> >> protejata impotriva scrierii / citirii. In momentul in care se
> semnalizeaza
> >> un acces invalid se efectueaza operatiile necesare (aducere din (3) in
> (1)
> >> daca exista page fault etc.). Sincronizarea intre (1) si (2) se face
> prin
> >> apelul ram_sync, as in se copiaza din memoria virtuala paginile marcate
> ca
> >> fiind in RAM si "dirty".
> >> Tu spui ca ar trebui sa elimin (1) si sa folosesc (2) pe post de memorie
> >> virtuala. Cum simulezi atunci pagefault? Functia vinit intoarce o adresa
> la
> >> care sunt mapate virt_pages.La (2) sunt mapate doar phys_pages, care e
> mai
> >> mic decat virt_pages.
> >
> > Ar fi bun un răspuns oficial, și eu tot ca Andrei am făcut deocamdată
> > pentru că așa am înțeles din textul temei.
>
> (adaugare la ce s-a comentat deja in acest thread, in caz ca mai este
> necesar)
>
> In primul rand, "fisierul RAM" si "RAM-ul fizic" sunt acelasi lucru.
> Maparea peste fisierul RAM poate fi considerata ca fiind "modul de acces
> la RAM-ul fizic".
>
> As dori sa stiu ce anume in textul temei duce la ideea ca ar fi 3 zone
> de memorie (3 mapari/alocari)?
>
> In textul temei este specificat faptul ca "Paginile de memorie virtuală
> (din spațiul de adresă al procesului) se vor mapa direct peste fișierul
> de RAM folosind apelurile mmap și MapViewOfFile."
>
> Asta nu inseamna ca *toate* paginile de memorie virtuala se mapeaza
> peste fisierul RAM, pentru ca:
> - fisierul RAM are phys_pages iar
> - memoria virtuala are virt_pages.
> (iar aceste valori pot fi diferite)
>
> --
> Mircea
> http://mircea.bardac.net
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20090430/efc10553/attachment-0001.htm>
More information about the so
mailing list