This shows you the differences between two versions of the page.
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'' |