This is an old revision of the document!


Tasks

Memoria Virtuala. Spațiul de adresă

  1. Formatul ELF
    • Compilati programul adr_space.c. Folosiți utilitarul readelf pentru a afisa informații despre secțiunile executabilului adr_space. (Hint: man readelf, search: sections)
    • Identificați secțiunile .text, .rodata, .data și .bss. Observați diferențele în coloana Type între .bss și .data. Ce înseamnă ele?
  2. Secțiunile unui executabil
    • Urmăriți declarațiile de variabile din fișierul adr_space.c. Determinați secțiunea în care a fost plasată fiecare variabilă. În acest scop folosiți objdump. (Hint: objdump -t)
    • Verificați că dimensiunea fiecărei variabile (a 5-a coloană din output-ul lui objdump) corespunde cu declarația corespunzătoare din fișierul adr_space.c.
    • De ce dimensiunea lui string2 este doar 4? Folosiți readelf pentru a afișa tot conținutul secțiunii .data (Hint: readelf -x). De ce lipsește conținutul variabilei string2?
    • Folosiți readelf pentru a căuta secțiunea în care este conținutul variabilei string2. Cum explicați?
  3. Layout-ul procesului în memorie
    • Rulați executabilul adr_space. Folosiți pmap pentru a afișa zonele de memorie mapate. Câte din zonele afișate de pmap sunt asociate executabilului adr_space? Identificați stiva și heap-ul.
    • Ne propunem să determinăm pentru fiecare din secțiunile .text, .rodata, .data și .bss în ce zonă de memorie au fost încărcate. Folosiți coloana Addr din output-ul lui readelf de la punctul 1 pentru a asocia fiecare din aceste secțiuni într-o zonă de memorie din cele afișate de pmap.
    • Cum a știut sistemul de operare să creeze cele 3 zone de memorie?
      • Secțiunile conțin doar informații “statice”, care ne ajută să ne organizăm mai bine executabilul. Când un executabil este rulat, însă, se folosesc alte informații din fișierul ELF pentru a stabili ce zone de memorie se creează. Aceste informații se numesc “Program headers” sau “Segmente”.
      • Afișați segmentele din fișierul adr_space, folosind readelf. Doar segmentele marcate cu “LOAD” vor fi încărcate în memorie. Corespund adresele acestor segmente cu output-ul lui pmap?

Stiva

  1. Rulați programul return_array. De ce nu funcționează? Corectați programul astfel încât să funcționeze corect.
  2. Rulați programul params. Cum explicați comportamentul?
  3. Rulați programul stackframe. Programul realizează apelurile de funcții mainfg. Funcția g afișează conținutul stivei. Identificați frame-urile corespunzătoare funcțiilor main, f și g.

Fun

  1. Sunt informațiile despre secțiuni absolut necesare? Analizați programul elf_magic. Câte secțiuni conține programul? Câte segmente conține programul? Credeți că programul va rula?
chmod +x elf_magic
./elf_magic
sesiuni/memory/2.1373278240.txt.gz · Last modified: 2013/07/08 13:10 by asendroiu