Sistemski softver/K1 Jul 1 2025

Izvor: SI Wiki
< Системски софтвер
Datum izmene: 20. septembar 2025. u 17:25; autor: Aleksa (razgovor | doprinosi) (Нова страница: {{tocright}} '''Први колоквијум у року јул 1 2025. године''' одржан је у августу 2025. На колоквијуму су од литературе били доступни ''SystemV ABI'' и ''amd64 Architecture Programmer's Manual''. Траја је 40 минута и садржао само теоријски део. {{решења}} == 1. задатак == Посматра се програм дефинисан из…)
(razl) ← Starija izmena | Trenutna verzija (razl) | Novija izmena → (razl)
Pređi na navigaciju Pređi na pretragu

Prvi kolokvijum u roku jul 1 2025. godine održan je u avgustu 2025. Na kolokvijumu su od literature bili dostupni SystemV ABI i amd64 Architecture Programmer's Manual. Traja je 40 minuta i sadržao samo teorijski deo.

  • Za pitanja sa više odgovora, tačni odgovori su podebljani i uokvireni
  • Za pitanja za koje se odgovori unose, tačni odgovori su podvučeni i sakriveni, tako da se prikažu kada izaberete taj tekst (primer: ovako)
  • Pritisnite levo dugme ispod za sakrivanje i otkrivanje svih odgovora, ili desno dugme za uključivanje i isključivanje interaktivnog režima:

1. zadatak

Posmatra se program definisan izvornim C kodom i izvornim asemblerskim kodom dobijenim prevođenjem datog izvornog C koda:

Izvorni C kod:

extern void bar();
int foo()
{
    int temp[8];
    bar();
}

Izvorni asemblerski kod:

.intel_syntax noprefix
.text
.global foo
.type foo, @function
foo:
    endbr64
    push rbp
    mov rbp, rsp
    sub rsp, 32
    mov eax, 0
    call bar
    nop
    leave
    ret

Šta je tačno za funkciju foo ukoliko se posmatra amd64 arhitektura i System V ABI konvencija? Izaberite jedan ili više odgovora:

  1. Funkcija foo morala je da alocira više prostora na steku nego što joj je suštinski potrebno radi obezbeđivanja poravnanja za lokalni podaci.
  2. Funkcija foo morala je da alocira više prostora na steku nego što joj je suštinski potrebno radi očuvanja garantovanog poravnanja oblasti za argumente pozivanih funkcija.
  3. Prostor koji koristi na steku funkcija foo mora prvobitno da alocira zbog postojanja "crvene zone".
  4. Veličina prostora na steku, koji alocira funkcija foo, jednaka je zbiru veličina podataka smeštenih na stek.
  5. Prostor koji koristi na steku funkcija foo mora prvobitno da alocira zbog toga što poziva druge funkcije.


2. zadatak

U nastavku je data definicija nekog tipa podataka StructType:

typedef struct
{
    int f1;
    char f2;
    int f3;
    char f4;
    int f5;
    char f6;
} StructType;

Označiti u nastavku šta predstavlja svaki bajt dela memorije (dat u "školskom" formatu prikazanom na auditornim vežbama) pod sledećim pretpostavkama:

  • struktura StructType smeštena je na prvo odgovarajuće slobodno mesto u datom delu memorije,
  • slobodan prostor u datom delu memorije počinje na adresi 0x8000004502 i
  • posmatra se amd64 arhitektura i System V ABI konvencija.

Napomene:

  • Odgovor out predstavlja bajt izvan posmatrane strukture.
  • Odgovor padd predstavlja neiskorišćeni odnosno padding bajt unutar posmatrane strukture.

3. zadatak

Koji od navedenih registara pozvana funkcija pre promene njihove vrednosti prvo mora da sačuva originalnu vrednost radi kasnije restauracije ukoliko se posmatra amd64 arhitektura i System V ABI konvencija?

  • rsi
  • rdi
  • rbx
  • r11
  • rbp
  • r8
  • r9
  • r10
  • r13
  • rdx
  • r12
  • rax
  • rcx

4. zadatak

Posmatra se program opisan sadržajem dela memorije i segmentom izvornog C koda.

Inicijalni sadržaj dela memorije (dat u "školskom" formatu prikazanom na auditornim vežbama):

Sadržaj memorije
Adresa +7 +6 +5 +4 +3 +2 +1 +0
0x400050006000 + 0x20 0x00 0x00 0xFF 0xFF 0xEE 0xEE 0xDD 0xDD
0x400050006000 + 0x18 0x00 0x00 0x40 0x00 0x50 0x00 0x60 0x0A
0x400050006000 + 0x10 0xCC 0xCC 0xBB 0xBB 0xAA 0xAA 0x99 0x99
0x400050006000 + 0x08 0x88 0x88 0x77 0x77 0x66 0x66 0x55 0x55
0x400050006000 + 0x00 0x44 0x44 0x33 0x33 0x22 0x22 0x11 0x11

Segment izvornog C koda:

#include <stdio.h>
#include <stdint.h>

extern uint64_t a;
extern uint8_t *b;

void main()
{
    printf("%#lx", a);
    printf("%p", &a);
    printf("%#x", *((uint16_t *)a + 2));
    printf("%#x", *((uint16_t *)a + 4));

    printf("%p", b);
    printf("%p", &b);
    printf("%#x", *(b + 2));
    printf("%#x", *(b + 4));
}

Dopunite sledeće konstatacije ukoliko se posmatra amd64 arhitektura i System V ABI konvencija, a simboli a i b imaju istu vrednost 0x400050006018:

  • Naredba printf("%lx", a); ispisuje 0x40005000600A.
  • Naredba printf("%p", &a); ispisuje 0x400050006018.
  • Naredba printf("%x", *((uint16_t *)a + 2)); ispisuje 0x8888.
  • Naredba printf("%#x", *((uint16_t *)a + 4)); ispisuje 0xAAAA.
  • Naredba printf("%p", b); ispisuje 0x40005000600A.
  • Naredba printf("%p", &b); ispisuje 0x400050006000.
  • Naredba printf("%#x", *(b + 2)); ispisuje 0x400050006018.
  • Naredba printf("%#x", *(b + 4)); ispisuje 0x77.

Napomene:

  • Ukoliko neku vrednost nije moguće odrediti na osnovu datog sadržaja dela memorije kao odgovor treba uneti znak pitanja (?)
  • Sve odgovore za uspešno određene vrednosti treba uneti u istom formatu kakvom ih program ispisuje.
  • Format "%p" služi za ispis vrednosti pokazivača u heksadecimalnom formatu sa prefiksom 0x (nakon prefiksa ne ispisuju se vodeće nule).
  • Format "%#x" služi za ispis neoznačenog celog broja u heksadecimalnom formatu sa prefiksom 0x (nakon prefiksa ne ispisuju se vodeće nule).

5. zadatak

Napomene