[so] [Tema 3] Nelamurire enunt

Dragos Valentin Moinescu dragos.moinescu at gmail.com
Fri May 1 18:52:41 EEST 2009


ok, fac un mmap(PROT_NONE) peste fisierul RAM cu virt_pages *
getpagesize() pentru a avea zona de memorie continua.

fisierul RAM are phys_pages < virt_pages.

Ce se intampla atunci cand accesez phys_pages + 1? Imi da SIGSEGV
pentru ca am initial PROT_NONE. Acea pagina nu se afla in RAM, pentru
ca in RAM sunt doar primele phys_pages (initial). Ce anume face libvm?
Eu am considerat ca oricum acele date depasesc fisierul, chiar daca
pun PROT_READ | PROT_WRITE. Deci, scrierea in phys_pages + 1 inseamna
scrierea inafara RAM-ului.

[0...4k-1][4k...8k-1][8k...12k-1]...[4k*(VP-1)...4k*VP-1]

asta este memoria intoarsa de mmap(NULL, ..., iRamFd, 0);

daca programul scrie in [16k...20k-1], pagina care se afla inafara
[0...16k-1] si se apeleaza msync() atunci fisierul RAM e cam busit.

ce vreau eu sa spun ca primii phys_pages*getpagesize() octeti din acea
zona pot fi mapati direct pe fisier si folosind msync() nu este nicio
problema. totusi daca scriem in (phys_pages+1)*getpagesize() atunci
msync modifica size-ul fisierului.

sincer nu pricep din enunt exact cum se poate face acest lucru doar cu
un msync. pentru a pastra size-ul fisierului trebuie sa stiu ce pagini
din memoria virtuala sunt active la un moment dat, si asta presupune
ca atunci cand fac un ram_sync() sa fac defapt scriere in fisierul ram
a datelor respective.

poate ne ajutati cu o iesplicatie :D

multumesc

2009/5/1 Mircea Bardac <cs at mircea.bardac.net>:
> Salut,
>
> Dragos Valentin Moinescu wrote:
>> Mai, din cate am inteles eu din tema, nu are niciun sens sa folosesti
>> RAM-ul fizic decat prin zonele mapate din cele doua fisiere.
>> 1 fisier mapat este SWAP-ul
>> 1 fisier mapat este RAM-ul
>>
>> in vinit() intorci adresa oferita prin maparea SWAP-ului (ca doar aia
>> este toata memoria de care beneficiaza programul).
>
> Dupa cum a spus si Andrei, modificarile facute in memoria intoarsa de
> catre vinit nu trebuie sa se reflecte direct in fisierul swap. Acolo
> ajung *doar dupa ce sunt evacuate din memoria RAM* (la swapping).
>
> "Paginile de memorie virtuala (din spatiul de adresa al procesului) se
> vor mapa direct peste fișierul de RAM folosind apelurile mmap si
> MapViewOfFile."
>
> --
> Mircea
> http://mircea.bardac.net
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>



-- 
Best regards,
Dragos Moinescu


More information about the so mailing list