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. <tt>"ram_sync</tt> va fi implementată folosind un apel <tt>msync</tt>.
"; "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:<br>
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.<br>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.<br>
3. Pagina se afla in RAM dar are doar PROT_READ: setez flagul dirty si ii dau dreptul PROT_WRITE.<br><br>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.<br>
<br>Mai ramane o intrebare... este valida solutia?<br><br><br><div class="gmail_quote">2009/4/30 Mircea Bardac <span dir="ltr"><<a href="mailto:cs@mircea.bardac.net">cs@mircea.bardac.net</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">Sergiu Iordache wrote:<br>
> 2009/4/21 Andrei Bucur <<a href="mailto:andrei.bucur@gmail.com">andrei.bucur@gmail.com</a>>:<br>
>> Eu ma gandesc ca tema trebuie structurata in modul urmator:<br>
>> 1. virt_pages pagini mapate peste RAM-ul fizic;<br>
>> 2. phys_pages pagini mapate peste fisierul RAM;<br>
>> 3. virt_pages pagini mapate peste fisierul SWAP.<br>
>> Accesul la memoria simulata se va face strict prin (1). Fiecare pagina va fi<br>
>> protejata impotriva scrierii / citirii. In momentul in care se semnalizeaza<br>
>> un acces invalid se efectueaza operatiile necesare (aducere din (3) in (1)<br>
>> daca exista page fault etc.). Sincronizarea intre (1) si (2) se face prin<br>
>> apelul ram_sync, as in se copiaza din memoria virtuala paginile marcate ca<br>
>> fiind in RAM si "dirty".<br>
>> Tu spui ca ar trebui sa elimin (1) si sa folosesc (2) pe post de memorie<br>
>> virtuala. Cum simulezi atunci pagefault? Functia vinit intoarce o adresa la<br>
>> care sunt mapate virt_pages.La (2) sunt mapate doar phys_pages, care e mai<br>
>> mic decat virt_pages.<br>
><br>
> Ar fi bun un răspuns oficial, și eu tot ca Andrei am făcut deocamdată<br>
> pentru că așa am înțeles din textul temei.<br>
<br>
</div>(adaugare la ce s-a comentat deja in acest thread, in caz ca mai este<br>
necesar)<br>
<br>
In primul rand, "fisierul RAM" si "RAM-ul fizic" sunt acelasi lucru.<br>
Maparea peste fisierul RAM poate fi considerata ca fiind "modul de acces<br>
la RAM-ul fizic".<br>
<br>
As dori sa stiu ce anume in textul temei duce la ideea ca ar fi 3 zone<br>
de memorie (3 mapari/alocari)?<br>
<br>
In textul temei este specificat faptul ca "Paginile de memorie virtuală<br>
(din spațiul de adresă al procesului) se vor mapa direct peste fișierul<br>
de RAM folosind apelurile mmap și MapViewOfFile."<br>
<br>
Asta nu inseamna ca *toate* paginile de memorie virtuala se mapeaza<br>
peste fisierul RAM, pentru ca:<br>
- fisierul RAM are phys_pages iar<br>
- memoria virtuala are virt_pages.<br>
(iar aceste valori pot fi diferite)<br>
<font color="#888888"><br>
--<br>
</font><div class="im">Mircea<br>
<a href="http://mircea.bardac.net" target="_blank">http://mircea.bardac.net</a><br>
_______________________________________________<br>
</div><div><div></div><div class="h5">so mailing list<br>
<a href="mailto:so@cursuri.cs.pub.ro">so@cursuri.cs.pub.ro</a><br>
<a href="http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so" target="_blank">http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so</a><br>
</div></div></blockquote></div><br>