Sistemski softver/K1 Jul 1 2025
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:
- 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.
- 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.
- Prostor koji koristi na steku funkcija foo mora prvobitno da alocira zbog postojanja "crvene zone".
- Veličina prostora na steku, koji alocira funkcija foo, jednaka je zbiru veličina podataka smeštenih na stek.
- 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
StructTypesmeštena je na prvo odgovarajuće slobodno mesto u datom delu memorije, - slobodan prostor u datom delu memorije počinje na adresi
0x8000004502i - 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
outpredstavlja bajt izvan posmatrane strukture. - Odgovor
paddpredstavlja 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):
| 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:
- Povratna vrednost funkcije foo prosleđuje se kao memorijski prostor alociran od strane pozivaoca nazad do pozivaoca.
- Parametar
param0prosleđuje se kao stackPushII u funkcijufooprilikom njenog poziva. - Parametar
param1prosleđuje se kao stackPushI u funkcijufooprilikom njenog poziva. - Parametar
param2prosleđuje se kao rsi u funkcijufooprilikom njenog poziva. - Parametar
param3prosleđuje se kao rdx u funkcijufooprilikom njenog poziva. - Parametar
param4prosleđuje se kao rcx u funkcijufooprilikom 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.