This shows you the differences between two versions of the page.
so:laboratoare:laborator-06 [2021/03/04 21:34] teodor_stefan.dutu [Exerciții] Precizare git pull |
so:laboratoare:laborator-06 [2022/04/13 15:14] (current) teodor_stefan.dutu [Exercițiul 3 - Detectare 'buffer underrun' folosind ElectricFence] |
||
---|---|---|---|
Line 547: | Line 547: | ||
</code> | </code> | ||
- | În cazul unor excepții cauzate de un acces invalid la memorie, ''ExceptionCode'' va fi setat la ''EXCEPTION_ACCESS_VIOLATION'' sau ''EXCEPTION_DATATYPE_MISALIGNMENT'', iar ''ExceptionAddress'' la adresa instrucțiunii care a cauzat excepția; ''NumberParameters'' va fi setat pe 2, iar prima intrare în ''ExceptionInformation'' va fi ''0'' dacă s-a efectuat o operație de citire sau ''1'' dacă s-a efectuat o operație de scriere. A doua intrare din ''ExceptionInformation'' va conține adresa virtuală la care s-a încercat accesarea fără drepturi, fapt care a dus la generarea excepției. Așadar, corespondentul câmpului ''si_addr'' din structura ''siginfo_t'' de pe Linux este ''ExceptionInformation'' pe Windows, NU ''ExceptionAddress''. | + | În cazul unor excepții cauzate de un acces invalid la memorie: |
+ | * ''ExceptionCode'' va fi setat la ''EXCEPTION_ACCESS_VIOLATION'' sau ''EXCEPTION_DATATYPE_MISALIGNMENT'' | ||
+ | * ''ExceptionAddress'' la adresa instrucțiunii care a cauzat excepția | ||
+ | * ''NumberParameters'' va fi setat pe 2 | ||
+ | * Prima intrare în ''ExceptionInformation'' va fi ''0'' dacă s-a efectuat o operație de citire sau ''1'' dacă s-a efectuat o operație de scriere. | ||
+ | * A doua intrare din ''ExceptionInformation'' va conține adresa virtuală la care s-a încercat accesarea fără drepturi, fapt care a dus la generarea excepției. | ||
+ | |||
+ | <color red>Așadar, corespondentul câmpului ''si_addr'' din structura ''siginfo_t'' de pe Linux este ''ExceptionInformation'' pe Windows, NU ''ExceptionAddress''. </color> | ||
+ | |||
+ | Funcția de tratare a excepției înregistrată cu [[http://msdn.microsoft.com/en-us/library/ms679274%28VS.85%29.aspx|AddVectoredExceptionHandler]] trebuie să întoarcă una din următoarele valori (macro-uri): | ||
+ | * ''EXCEPTION_CONTINUE_EXECUTION'', dacă excepția a fost tratată și se dorește continuarea execuției | ||
+ | * ''EXCEPTION_CONTINUE_SEARCH'' pentru a continua parcurgerea listei de funcții de tratare a excepțiilor, în caz că au fost înregistrate mai multe astfel de funcții. | ||
+ | |||
+ | ===== Sumar ===== | ||
+ | |||
+ | |||
+ | ^ Operație ^ Linux ^ Windows^ | ||
+ | | Maparea unui fișier | [[#maparea_fisierelor|mmap]] | [[#maparea_fisierelor1|CreateFileMapping]] + [[#maparea_fisierelor1|MapViewOfFile]] | | ||
+ | | Demaparea unui fișier | [[#demaparea_unei_zone_din_spatiul_de_adresa|munmap]] | [[#demaparea_unei_zone_din_spatiul_de_adresa1|UnmapViewOfFile]] | | ||
+ | | Maparea unei zone de memorie | [[#maparea_fisierelor|mmap]] | [[#alocare_de_memorie_in_spatiul_de_adresa_al_procesului1|VirtualAlloc]] | | ||
+ | | Demaparea unei zone de memorie | [[#demaparea_unei_zone_din_spatiul_de_adresa|munmap]]| [[#demaparea_unei_zone_din_spatiul_de_adresa1|VirtualFree]] | | ||
+ | | Redimensionarea unei zone mapate | [[#redimensionarea_unei_zone_mapate|mremap]] | - | | ||
+ | | Schimbarea protecției unei zone mapate | [[#schimbarea_protectiei_unei_zone_mapate|mprotect]] | [[#schimbarea_protectiei_unei_zone_mapate1|VirtualProtect]] | | ||
+ | | Blocarea paginării | [[#blocarea_paginarii|mlock]] | [[#blocarea_paginarii1|VirtualLock]] | | ||
+ | | Deblocarea paginării | [[#blocarea_paginarii|munlock]] | [[#blocarea_paginarii1|VirtualUnlock]] | | ||
+ | | Interogarea zonelor mapate | - | [[#interogarea_zonelor_mapate|VirtualQuery]] | | ||
+ | |Excepții (accesul incorect la memorie) |Programul primește SIGSEGV sau SIGBUS. \\ \\ Dacă se folosește o funcție de tip ''sa_sigaction'' pentru interceptarea semnalelor, atunci structura [[#exceptii|siginfo_t]] primită ca parametru conține informații referitoare la ce a cauzat excepția (semnalul, adresa, cauza excepției).|Pentru tratarea excepțiilor se pot folosi funcțiile [[#exceptii1|AddVectoredExceptionHandler]] și [[#exceptii1|RemoveVectoredExceptionHandler]] împreună cu o funcție de tratare a excepțiilor.| | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
- | Funcția de tratare a excepției înregistrată cu [[http://msdn.microsoft.com/en-us/library/ms679274%28VS.85%29.aspx|AddVectoredExceptionHandler]] trebuie să întoarcă ''EXCEPTION_CONTINUE_EXECUTION'', dacă excepția a fost tratată și se dorește continuarea execuției, sau ''EXCEPTION_CONTINUE_SEARCH'' pentru a continua parcurgerea listei de funcții de tratare a excepțiilor, în caz că au fost înregistrate mai multe astfel de funcții. | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
Line 566: | Line 599: | ||
<note> Pentru a vă ajuta la implementarea exercițiilor din laborator, în directorul ''utils'' din arhivă există un fișier ''utils.h'' cu funcții utile. </note> | <note> Pentru a vă ajuta la implementarea exercițiilor din laborator, în directorul ''utils'' din arhivă există un fișier ''utils.h'' cu funcții utile. </note> | ||
+ | |||
+ | ==== Exercițiul 0 - GSOC ==== | ||
+ | |||
+ | Google Summer of Code este un program de vară în care studenții | ||
+ | (indiferent de anul de studiu) sunt implicați în proiecte Open Source | ||
+ | pentru a își dezvolta skill-urile de programare, fiind răsplătiți cu o | ||
+ | bursă a cărei valoare [[https://developers.google.com/open-source/gsoc/help/student-stipends|depinde de țară]] | ||
+ | ([[https://developers.google.com/open-source/gsoc|pagină principală GSOC]]). | ||
+ | |||
+ | UPB se află în top ca număr de studenți acceptați; în fiecare an fiind undeva la aprox. 30-40 de studenți acceptați. | ||
+ | Vă încurajăm să aplicați! | ||
+ | |||
===== Linux ===== | ===== Linux ===== | ||
Line 633: | Line 678: | ||
<code bash> | <code bash> | ||
- | $ wget http://ro.archive.ubuntu.com/ubuntu/pool/main/e/electric-fence/electric-fence_2.2.4_i386.deb | + | $ wget http://ro.archive.ubuntu.com/ubuntu/pool/main/e/electric-fence/electric-fence_2.2.4_amd64.deb |
- | $ sudo dpkg -i electric-fence_2.2.4_i386.deb | + | $ sudo dpkg -i electric-fence_2.2.4_amd64.deb |
</code> | </code> | ||
</note> | </note> | ||
Line 641: | Line 686: | ||
Intrați în directorul ''4-cp'' și completați sursa ''mycp.c'' astfel încât să realizeze copierea unui fișier primit ca argument. Pentru aceasta, mapați ambele fișiere în memorie și realizați copierea folosind ''memcpy''. Urmăriți comentariile cu ''TODO'' din sursă și următoarele hint-uri: | Intrați în directorul ''4-cp'' și completați sursa ''mycp.c'' astfel încât să realizeze copierea unui fișier primit ca argument. Pentru aceasta, mapați ambele fișiere în memorie și realizați copierea folosind ''memcpy''. Urmăriți comentariile cu ''TODO'' din sursă și următoarele hint-uri: | ||
* Înainte de mapare, aflați dimensiunea fișierului sursă folosind [[http://linux.die.net/man/2/fstat | fstat]]. | * Înainte de mapare, aflați dimensiunea fișierului sursă folosind [[http://linux.die.net/man/2/fstat | fstat]]. | ||
- | * Trunchiați fișierul destinație la dimensiunea fișierului sursă folosing [[https://linux.die.net/man/2/ftruncate | ftruncate]]. | + | * Trunchiați fișierul destinație la dimensiunea fișierului sursă folosind [[https://linux.die.net/man/2/ftruncate | ftruncate]]. |
* Folosiți ''MAP_SHARED'' pentru mapare pentru a fi transmise schimbările în fișier: rețineți faptul că apelul mmap folosește una dintre opțiunile ''MAP_SHARED'' sau ''MAP_PRIVATE'' (una singură) | * Folosiți ''MAP_SHARED'' pentru mapare pentru a fi transmise schimbările în fișier: rețineți faptul că apelul mmap folosește una dintre opțiunile ''MAP_SHARED'' sau ''MAP_PRIVATE'' (una singură) | ||
* Pentru fișierul de intrare protecția trebuie să fie ''PROT_READ'': fișierul a fost deschis read-only. | * Pentru fișierul de intrare protecția trebuie să fie ''PROT_READ'': fișierul a fost deschis read-only. | ||
Line 730: | Line 775: | ||
Încărcați proiectul ''4-prot'' și inspectați sursa ''libvm.c''. | Încărcați proiectul ''4-prot'' și inspectați sursa ''libvm.c''. | ||
- | Să se creeze o zonă de memorie în spațiul de adresă, formată din trei pagini virtuale (folosiți un singur apel ''VirtualAlloc''). Prima pagina nu va avea vreun drept, a două va avea drepturi de citire, iar a treia va avea drepturi de scriere (folosiți ''VirtualProtect'' pentru a configura drepturile fiecărei pagini). Să se testeze comportamentul programului când se fac accese de citire și scriere în aceste zone. Urmăriți comentariile cu ''TODO 1''. | + | Creați o zonă de memorie în spațiul de adresă al procesului, formată din trei pagini virtuale (folosiți un singur apel ''VirtualAlloc''). Folosind ''VirtualProtect'' pentru a configuara drepturile fiecărei pagini, realizați modificările necesare astfel încât: |
+ | * prima pagină nu are niciun drept. | ||
+ | * a doua pagină are doar drepturi de citire. | ||
+ | * a treia pagină are drepturi de scriere. | ||
+ | |||
+ | Testați comportamentul programului când se fac accese de citire și scriere în aceste zone. Urmăriți comentariile cu ''TODO 1''. | ||
+ | |||
+ | Adăugați un handler de tratare a excepțiilor care să remapeze incremental zonele cu protecție de citire și scriere la generarea excepțiilor. Astfel, dacă pagina nu are niciun drept, la page fault se va remapa cu drepturi de citire. Dacă pagina are drepturi de citire, la page fault se va remapa cu drepturi de citire + drepturi de scriere. Urmăriți comentariile cu ''TODO 2''. | ||
+ | |||
+ | <note important> | ||
+ | Revedeți secțiunea [[#exceptii1|Excepții]]. | ||
+ | </note> | ||
- | Adăugați un handler de tratare a excepțiilor care să remapeze incremental zonele cu protecție de citire și scriere la generarea excepțiilor. Astfel, dacă pagina nu are vreun drept, la page fault se va remapa cu drepturi de citire. Dacă pagina are drepturi de citire, la page fault se va remapa cu drepturi de citire + drepturi de scriere. Urmăriți comentariile cu ''TODO 2''. | ||
==== Exercițiul 5 - Detectare 'buffer overrun' - implementare utilitar asemănător cu Electric Fence ==== | ==== Exercițiul 5 - Detectare 'buffer overrun' - implementare utilitar asemănător cu Electric Fence ==== | ||
Line 752: | Line 808: | ||
* Care sunt cele mai importante diferențe între metoda [[https://docs.python.org/2/library/mmap.html|mmap]] din modulul de Python cu același nume și funcția [[http://man7.org/linux/man-pages/man2/mmap.2.html|nativă]] din Linux? | * Care sunt cele mai importante diferențe între metoda [[https://docs.python.org/2/library/mmap.html|mmap]] din modulul de Python cu același nume și funcția [[http://man7.org/linux/man-pages/man2/mmap.2.html|nativă]] din Linux? | ||
- | ===== Soluții ===== | ||
- | |||
- | [[http://elf.cs.pub.ro/so/res/laboratoare/lab06-sol.zip | Soluții exerciții laborator 6]] | ||
===== Resurse Utile ===== | ===== Resurse Utile ===== |