Sistemski softver/K1 Jul 1 2025
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:
- 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.
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 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).