Differences

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

Link to this comparison view

so:curs:memory [2020/03/17 10:12]
razvan.deaconescu
so:curs:memory [2020/04/04 07:31] (current)
razvan.deaconescu
Line 16: Line 16:
  
   * Filmări:   * Filmări:
 +    * 3CA https://​web.microsoftstream.com/​video/​ce74a651-92cd-4e7b-8a8b-6b43ac4c08c2
     * 3CC curs 7, partea 1: https://​web.microsoftstream.com/​video/​5e791d5e-c7e4-4ef5-a6d9-80a88f7837e7     * 3CC curs 7, partea 1: https://​web.microsoftstream.com/​video/​5e791d5e-c7e4-4ef5-a6d9-80a88f7837e7
     * 3CC curs 7, partea a 2-a: https://​web.microsoftstream.com/​video/​92d17532-46d5-4656-b384-0c04c6874e34     * 3CC curs 7, partea a 2-a: https://​web.microsoftstream.com/​video/​92d17532-46d5-4656-b384-0c04c6874e34
 +    * 3CC curs 8, partea 1: https://​web.microsoftstream.com/​video/​42f5e650-8e0a-44c7-9b68-e13d664a81fc?​channelId=65910ece-e9a5-4a88-8641-cec8816ee99a
 +    * 3CC curs 8, partea 2: https://​web.microsoftstream.com/​video/​83db6df1-95a5-491f-aaab-ef45b0676a12?​channelId=65910ece-e9a5-4a88-8641-cec8816ee99a
  
   * Resurse vechi   * Resurse vechi
     * [[http://​prezi.com/​gfswijyf3vsk/?​utm_campaign=share&​utm_medium=copy&​rc=ex0share | Curs 05 - Gestiunea memoriei (vizualizare Prezi)]]     * [[http://​prezi.com/​gfswijyf3vsk/?​utm_campaign=share&​utm_medium=copy&​rc=ex0share | Curs 05 - Gestiunea memoriei (vizualizare Prezi)]]
     * [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-05.pdf | Curs 05 - Gestiunea memoriei (PDF)]]     * [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-05.pdf | Curs 05 - Gestiunea memoriei (PDF)]]
 +
 +  * Slide-uri CA [[https://​www.slideshare.net/​alexandruradovici/​sisteme-de-operare-gestiunea-memoriei|slideshare]]
  
 ===== Demo-uri ===== ===== Demo-uri =====
Line 123: Line 128:
 </​code>​ </​code>​
  
-Observăm un număr semnificativ mai mare de TLB miss-uri datorat numeroaselor schimbări de context ce au loc între procesele pornite de scriptul ''​start-all'​.+Observăm un număr semnificativ mai mare de TLB miss-uri datorat numeroaselor schimbări de context ce au loc între procesele pornite de scriptul ''​start-all''. 
 + 
 +==== Permisiuni de access ==== 
 + 
 +În tabela de pagini a unui proces, fiecare intrare are asociate permisiuni de access: citire (//read//), scriere (//write//) și, mai recent, execuție (//​execute//​). În general zonele din spațiul de adrese al procesului au permisiuni corespunzătoare rolului lor: zona de date (''​.data''​),​ în care stocăm variabilele globale, are permisiuni de citire și scriere, iar zona de cod (''​.text''​),​ în care se găsesc funcțiile (codul executabil),​ are permisiuni de citire și execuție. 
 + 
 +În subdirectorul ''​access-permissions/''​ demonstrăm funcționarea acestor permisiuni. În fișierul cod sursă ''​access-permissions.c'',​ variabila ''​data''​ este o variabilă globală stocată în zona de date, iar ''​exec_do_nothing''​ este o funcție aflată în zona de cod. Pe acest două variabile realizăm cele trei tipuri de acțiuni: citire, scriere, execuție. 
 + 
 +Ca să verificăm, compilăm programul folosind comanda ''​make''​ și apoi rulăm executabilul generat folosind comanda ''​./​access-permissions''​. Programul va rula cu succes: 
 + 
 +<​code>​ 
 +$ ./​access-permissions  
 +reading from .data section 
 +writing to .data section 
 +reading from .text section 
 +executing .text section 
 +</​code>​ 
 + 
 +Acest lucru se întâmplă pentru că liniile de cod problematice (cu accese nevalide) sunt comentate:​ 
 +<​code>​ 
 +        /* These won't work due to permission issues. */ 
 +        //​do_exec("​executing .data section",​ &​data[0]);​ 
 +        //​do_write("​writing to .text section",​ exec_do_nothing,​ 77); 
 +</​code>​ 
 + 
 +Dacă vom decomenta câte o linie dintre cele de mai sus și vom rula executabilul,​ vom primi excepție de access la memorie (//​Segmentation fault//). Pentru că facem acces nevalid: de execuție la variabila globală ''​data''​ aflată într-o zonă care nu poate fi executată; de scriere la funcția ''​exec_do_nothing''​ aflată într-o zonă care nu poate fi scrisă. 
 + 
 +Dacă rulăm comanda ''​dmesg''​ aflăm informații despre excepția de access la memorie: 
 +<​code>​ 
 +[2556682.592368] access-permissi[24582]:​ segfault at 56337d586010 ip 000056337d586010 sp 00007ffc899aede8 error 15 in access-permissions[56337d586000+1000] 
 +[2556762.153281] access-permissi[24638]:​ segfault at 558684f0763a ip 0000558684f07667 sp 00007ffffe4b8d70 error 7 in access-permissions[558684f07000+1000] 
 +</​code>​ 
 + 
 +În rezultatul de mai sus, codul erorii ne oferă informații despre ce a cauzat excepția. [[https://​utcc.utoronto.ca/​~cks/​space/​blog/​linux/​KernelSegfaultErrorCodes|Conform documentației]],​ codurile de eroare înseamnă:​ 
 +  * ''​15''​ este acces de execuție la o zonă validă în spațiul de adrese dar neexecutabilă,​ adică accesul de execuție la variabila globală ''​data''​ 
 +  * ''​7''​ este acces de scriere la o zonă validă în spațiul de adrese dar care nu poate fi scrisă, adică accesul de scriere la funcția ''​exec_do_nothing''​
so/curs/memory.1584432776.txt.gz · Last modified: 2020/03/17 10:12 by razvan.deaconescu
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