Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:laboratoare:laborator-06 [2019/03/24 22:53]
eduard.staniloiu
so:laboratoare:laborator-06 [2022/04/13 15:14] (current)
teodor_stefan.dutu [Exercițiul 3 - Detectare 'buffer underrun' folosind ElectricFence]
Line 2: Line 2:
  
  
-===== Materiale ajutătoare ===== 
- 
-  *[[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab06-slides.pdf | lab06-slides.pdf]] 
-  *[[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab06-refcard.pdf | lab06-refcard.pdf]] 
  
 ==== Nice to read ==== ==== Nice to read ====
Line 11: Line 7:
   * TLPI - Chapter 49, Memory mappings ​   * TLPI - Chapter 49, Memory mappings ​
   * TLPI - Chapter 50, Virtual memory operations   * TLPI - Chapter 50, Virtual memory operations
 +
 +===== Link-uri către secțiuni utile =====
 +
 +==== Linux ====
 +  * [[#​maparea_fisierelor|Maparea fișierelor]]
 +  * [[#​alocare_de_memorie_in_spatiul_de_adresa_al_procesului|Alocare de memorie în spațiul de adresă al procesului]]
 +  * [[#​maparea_dispozitivelor|Maparea dispozitivelor]]
 +  * [[#​demaparea_unei_zone_din_spatiul_de_adresa|Demaparea unei zone din spațiul de adresă]]
 +  * [[#​redimensionarea_unei_zone_mapate|Redimensionarea unei zone mapate]]
 +  * [[#​schimbarea_protectiei_unei_zone_mapate|Schimbarea protecției unei zone mapate]]
 +  * [[#​blocarea_paginarii|Blocarea paginării]]
 +  * [[#​electricfence|ElectricFence]]
 +
 +==== Windows ====
 +  * [[#​maparea_fisierelor1|Maparea fișierelor]]
 +  * [[#​alocare_de_memorie_in_spatiul_de_adresa_al_procesului1|Alocare de memorie în spațiul de adresă al procesului]]
 +  * [[#​demaparea_unei_zone_din_spatiul_de_adresa1|Demaparea unei zone din spațiul de adresă]]
 +  * [[#​schimbarea_protectiei_unei_zone_mapate1|Schimbarea protecției unei zone mapate]]
 +  * [[#​interogarea_zonelor_mapate|Interogarea zonelor mapate]]
 +  * [[#​blocarea_paginarii1|Blocarea paginării]]
  
 ===== Memoria virtuală ===== ===== Memoria virtuală =====
Line 531: 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.
  
-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. +<color red>​Așadar,​ corespondentul câmpului ''​si_addr''​ din structura ''​siginfo_t'' ​de pe Linux este ''​ExceptionInformation'' ​pe WindowsNU ''​ExceptionAddress''​. ​</​color>​
-===== Exerciții =====+
  
-===== Exercițiul 0 Joc interactiv =====+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.
  
-  * Detalii desfășurare [[http://​ocw.cs.pub.ro/​courses/​so/​meta/​notare#​joc_interactiv|joc]].+===== Sumar =====
  
  
-<note important>​În ​rezolvarea laboratorului, ​folosiți arhiva ​de sarcini [[http://elf.cs.pub.ro/so/res/laboratoare/lab06-tasks.zip | lab06-tasks.zip]]+^ Operație ^ Linux ^ Windows^ 
-Platforma este la alegerea voastră. Punctajul maxim se poate obține fie pe Linuxfie pe Windows. Lucrați în mașina virtuală+| 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.| 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +===== Exerciții ===== 
 + 
 +<note important>​ 
 +În cadrul laboratoarelor vom folosi ​repository-ul ​de git al materiei SO - https://github.com/​systems-cs-pub-ro/so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''​git clone https://github.com/systems-cs-pub-ro/​so''​Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''​git clone https://​github.com/​systems-cs-pub-ro/​so ${target}''​
 + 
 +Pentru a actualiza repository-ul,​ folosiți comanda ''​git pull origin master''​ din interiorul directorului în care se află repository-ulRecomandarea este să îl actualizați cât mai frecventînainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. În cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările:​ 
 +<​code>​ 
 +git stash 
 +git pull origin master 
 +git stash pop 
 +</​code>​ 
 + 
 +Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://​gitimmersion.com.
 </​note>​ </​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>​ <​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 613: 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 621: 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 627: Line 692:
    * Argumentele funcției [[http://​man7.org/​linux/​man-pages/​man3/​memcpy.3.html|memcpy]] sunt, în ordine: destinația,​ sursa, numărul de octeți care să fie copiați.    * Argumentele funcției [[http://​man7.org/​linux/​man-pages/​man3/​memcpy.3.html|memcpy]] sunt, în ordine: destinația,​ sursa, numărul de octeți care să fie copiați.
    * Revedeți secțiunea [[#​maparea_fișierelor|maparea fișierelor]].    * Revedeți secțiunea [[#​maparea_fișierelor|maparea fișierelor]].
 +   * Asigurați persistența datelor pe sistemul de fișiere printr-un apel explicit [[https://​ocw.cs.pub.ro/​courses/​so/​laboratoare/​laborator-06#​msync|msync]]
  
 Puteți testa în felul următor: <code bash> Puteți testa în felul următor: <code bash>
Line 709: 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 731: 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 =====
so/laboratoare/laborator-06.1553460796.txt.gz · Last modified: 2019/03/24 22:53 by eduard.staniloiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0