Sistemski softver/K1 Jul 1 2025

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

Prvi kolokvijum u roku jul 1 2025. godine održan je 21. avgusta 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 koji se skalirao na 20 poena. Ista postavka došla je i u roku septembar 1 2025. godine, na ispitu održanom 21. septembra, pod istim uslovima polaganja.

  • 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.
+7 +6 +5 +4 +3 +2 +1 +0
out out out out padd padd padd f6
f5 f5 f5 f5 padd padd padd f4
f3 f3 f3 f3 padd padd padd f2
f1 f1 f1 f1 out out out out

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 0x400050006018.
  • Naredba printf("%#x", *(b + 2)); ispisuje 0x77.
  • Naredba printf("%#x", *(b + 4)); ispisuje 0x88.

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

U nastavku je data deklaracija funkcije foo i definicije pratećih tipova podataka:

typedef struct
{
    long fA1;
    long fA2;
    long fA3;
} StructTypeA;

extern StructTypeA foo(
  StructTypeA param0,
  StructTypeA param1,
  double * param2,
  float * param3,
  double * param4
);

Dopuniti sledeće konstatacije ukoliko se posmatra amd64 arhitektura i System V ABI konvencija:

  1. Povratna vrednost funkcije foo prosleđuje se kao memorijski prostor alociran od strane pozivaoca nazad do pozivaoca.
  2. Parametar param0 prosleđuje se kao stackPushII u funkciju foo prilikom njenog poziva.
  3. Parametar param1 prosleđuje se kao stackPushI u funkciju foo prilikom njenog poziva.
  4. Parametar param2 prosleđuje se kao rsi u funkciju foo prilikom njenog poziva.
  5. Parametar param3 prosleđuje se kao rdx u funkciju foo prilikom njenog poziva.
  6. Parametar param4 prosleđuje se kao rcx u funkciju foo prilikom njenog poziva.

Napomene:

  • Odgovor kombinacija GP predstavlja određenu kombinaciju (više od jednog) isključivo General Purpose registara.
  • Odgovor kombinacija SSE predstavlja određenu kombinaciju (više od jednog) isključivo Streaming SIMD Extension registara.
  • Odgovor kombinacija GP/SSE predstavlja određenu kombinaciju (više od jednog) General Purpose i Streaming SIMD Extension registara.
  • Odgovor stackPush<roman-numeral>, gde je <roman-numeral> rimski broj, predstavlja argument koji se prosleđuje preko steka pri čemu rimski broj označava međusobni poredak push operacija odnosno redosled stavljanja datog argumenta na vrh steka u odnosu na druge argumente koji se takođe prosleđuju preko steka.

Napomene