-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1653c70
commit 3bc28f5
Showing
2 changed files
with
195 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
2023/mart/SI Kolokvijum 1 - Mart 2023 - Resenja.pdf | ||
-------------------------------------------------------------------------------- | ||
linker | ||
1. ```asm | ||
seg bss | ||
a dd 256 dup 0 | ||
n dd 0 | ||
endseg | ||
seg text | ||
max_a: load r1, [sp+8] ; r1 := n | ||
load r2, #1 ; if (n<=1) | ||
cmp r1, r2 | ||
jg L0001 | ||
load r0, a ; return a[0] | ||
ret | ||
L0001: sub r1, r1, r2 ; r1 := n-1 | ||
push r1 ; r0 := max_a(n-1) | ||
call max_a | ||
pop r1 | ||
load r2, #2 ; r1:= a[n-1] | ||
shl r1, r1, r2 | ||
load r1, a[r1] | ||
cmp r1, r0 ; (a[n-1]>m)? | ||
jle L0002 | ||
load r0, r1 | ||
L0002: ret | ||
endseg | ||
``` | ||
2. Instrukcije koje u sebi sadrže zapis neposrednog operanda, pomeraja ili apsolutne adrese zauzimaju dve 32-bitne reči (8 bajtova), ostale zauzimaju po jednu (4 bajta). | ||
``` | ||
L0001 = max_a + 4*8 + 2*4 = max_a + 40 | ||
L0002 = L0001 + 4*8 + 6*4 = L0001 + 56 = max_a + 96 | ||
``` | ||
3. ``` | ||
a = 0 | ||
n = a+256*4 = 1024 | ||
max_a = 4*1024 = 4096 | ||
L0001 = max_a + 40 = 4136 | ||
L0002 = max_a + 96 = 4192 | ||
``` | ||
|
||
-------------------------------------------------------------------------------- | ||
segment | ||
|
||
1. \begin{tabular}{|c|c|c|} | ||
\hline | ||
Segment \# (hex) & Limit (hex) & RWX (bin) \\ | ||
\hline | ||
0 & FFF & 001 \\ | ||
\hline | ||
1 & FFF & 001 \\ | ||
\hline | ||
2 & 88F & 001 \\ | ||
\hline | ||
3 & FEF & 100 \\ | ||
\hline | ||
4 & FFF & 001 \\ | ||
\hline | ||
5 & FFF & 001 \\ | ||
\hline | ||
6 & FFF & 001 \\ | ||
\hline | ||
7 & E67 & 001 \\ | ||
\hline | ||
28 & FFF & 110 \\ | ||
\hline | ||
29 & 899 & 110 \\ | ||
\hline | ||
FE & FFF & 110 \\ | ||
\hline | ||
FF & FFF & 110 \\ | ||
\hline | ||
\end{tabular} | ||
2. Adresa FDFFFh pripada segmentu broj FDh. | ||
|
||
-------------------------------------------------------------------------------- | ||
page | ||
```cpp | ||
typedef PgDsc uint32; | ||
typedef Frame uint16; | ||
inline void setPgRW(PgDsc* pd) { | ||
*pd |= ((PgDsc)3) << 30; | ||
} | ||
int copyOnWrite(PgDsc* pd) { | ||
Frame oldFrame = (Frame)(*pd); | ||
if (frames[oldFrame] > 1) { | ||
Frame newFrame = getFreeFrame(); | ||
if (newFrame == 0) return -1; | ||
frames[newFrame] = 1; | ||
frames[oldFrame]--; | ||
*pd = newFrame; | ||
copyFrame(oldFrame, newFrame); | ||
} | ||
setPgRW(pd); | ||
return 0; | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
2023/mart/SI Kolokvijum 1 - Mart 2023.pdf | ||
-------------------------------------------------------------------------------- | ||
linker | ||
Dat je sadržaj jednog izvornog fajla sa C kodom. | ||
|
||
```c | ||
int a[256], n; | ||
int max_a(int n) { | ||
if (n <= 1) return a[0]; | ||
int m = max_a(n-1); | ||
return (a[n - 1] > m) ? a[n - 1] : m; | ||
} | ||
``` | ||
1. Napisati asemblerski kod za 32-bitni procesor picoRISC, sa sintaksom direktiva pokazanom na predavanjima, kakav bi prevodilac mogao da napravi prevođenjem ovog fajla. Logički segment se na asembleru deklariše direktivom `seg` uz koju ide kvalifikator za tip segmenta (`text`, `bss` ili `data`); npr. `seg text`. Stek raste ka nižim adresama, SP ukazuje na poslednju popunjenu lokaciju, adresibilna jedinica je bajt, a instrukcija poziva potprograma na steku čuva PC i PSW tim redom. | ||
2. Za svaku labelu unutar asemblerskog koda prevoda funkcije `max_a` odrediti pomeraj (razliku) njene vrednosti (adrese u koju se preslikava) u odnosu na vrednost labele koja označava prvu instrukciju ove funkcije. Vrednosti pisati decimalno i obrazložiti rezultat. | ||
3. Ukoliko se logički segmenti nastali prevodom ovog fajla alociraju redom, jedan odmah iza drugog u virtuelnom adresnom prostoru, svaki logički segment poravnat na početak stranice veličine 4 KB, a prvi od njih počinje od virtuelne adrese 0, odrediti virtuelne adrese u koje se preslikavaju svi simboli u asemblerskom prevodu (labele za sve definisane podatke i one koje označavaju instrukcije prevodene funkcije `max_a`). Kratko obrazložiti rezultat. | ||
-------------------------------------------------------------------------------- | ||
segment | ||
U nekom sistemu sa segmentnom organizacijom memorije adresibilna jedinica je bajt, virtuelni adresni prostor je velične 1 MB, a maksimalna veličina fizičkog segmenta je 4 KB. Dat je spisak početnih (virtuelnih) adresa, veličina (obe vrednosti su zapisane heksadecimalno) i vrsta logičkih segmenata (regiona) koje je alocirao neki proces. | ||
\begin{center} | ||
\begin{tabular}{|c|c|c|} | ||
\hline | ||
Adresa segmenta (hex) & Veličina (hex) & Vrsta segmenta \\ | ||
\hline | ||
0 & 2890 & instrukcije \\ | ||
\hline | ||
3000 & FF0 & konstantni podaci incijalizovani statički \\ | ||
\hline | ||
4000 & 3E68 & instrukcije \\ | ||
\hline | ||
28000 & 189A & promenljivi podaci \\ | ||
\hline | ||
FE000 & 2000 & stek \\ | ||
\hline | ||
\end{tabular} | ||
\end{center} | ||
1. U datu tabelu upisati parametre svih fizičkih segmenata koje je operativni sistem organizovao u SMT (sve ulaze u SMT koji nisu *null*) za ovaj proces, po rastućem redosledu broja segmenta. Broj segmenta i granicu segmenta (*limit*, najvišu dozvoljenu vrednost pomeraja u segmentu koji se sme adresirati) zapisati heksadecimalno, a bite prava pristupa *RWX* binarno tim redom. (Broj redova u datoj tabeli ne mora da odgovara broju segmenata koje treba upisati; eventualni višak redova date tabele ostaviti prazne.) | ||
2. Ako stek raste ka nižim adresama, koja virtuelna adresa je prva koja je van dozvoljenog opsega i nije dozvoljena za adresiranje ako stek prekorači svoj dozvoljeni kapacitet? | ||
Odgovor (hex): ____________ | ||
Kom fizičkom segmentu pripada ta adresa? | ||
Odgovor (hex): ____________ | ||
\begin{figure}[H] | ||
\centering | ||
\begin{tabular}{|c|c|c|} | ||
\hline | ||
Segment \# (hex) & Limit (hex) & RWX (bin) \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
& & \\ | ||
\hline | ||
\end{tabular} | ||
\caption{Tabela data uz stavku 1 drugog zadatka.} | ||
\end{figure} | ||
-------------------------------------------------------------------------------- | ||
page | ||
Neki sistem sa straničnom organizacijom memorije koristi tehniku kopiranja pri upisu (*copy on write*). Deskriptor stranice u PMT je veličine 32 bita, s tim da najnižih 16 bita sadrži broj okvira, a najviša tri bita koduju prava pristupa *RWX* tim redom (bit *R* je najviši bit). | ||
Za evidenciju svih okvira raspoložive operativne memorije sistem koristi niz `frames`; *i*-ti element ovog niza odgovara okviru broj *i*. Vrednost ovog elementa označava broj stranica koje dele isti okvir pre razdvajanja pri upisu; ako je ta vrednost 0, okvir je slobodan; ako je ta vrednost 1, okvir koristi samo jedna stranica jednog procesa; ako je ta vrednost veća od 1, taj okvir dele stranice različitih procesa. | ||
Kada obrađuje hardverski izuzetak zbog pokušaja nedozvoljenog upisa, nakon provere da adresirana stranica pripada segmentu koji je logički dozvoljen za upis i da treba raditi kopiranje pri upisu, jezgro poziva operaciju `copyOnWrite` sa argumentom koji pokazuje na deskriptor stranice u koju je pokušan upis. Ta funkcija tada treba da iskopira sadržaj okvira u nov okvir i da stranicu koja je referencirana preusmeri u taj okvir i dozvoli upis u tu stranicu. Ostale stranice koje su koristile isti okvir, čak i ako je to samo jedna preostala, se ne menjaju. Kada se pokuša upis u poslednju preostalu stranicu koja je delila taj okvir, ova funkcija će samo dozvoliti upis u nju (nema potrebe kopirati je, jer je jedina). | ||
Implementirati funkciju: `int copyOnWrite(uint32* pd)`. Na raspolaganju je sledeće: | ||
- `getFreeFrame()`: vraća broj prvog slobodnog okvira; ukoliko takvog nema, vraća 0; | ||
- `copyFrame(uint16 oldFrame, uint16 newFrame)`: kopira sadržaj iz okvira broj | ||
`oldFrame` u okvir broj `newFrame`. | ||
Ako slobodnog okvira nema, funkcija `copyOnWrite` ne treba ništa da menja, samo da vrati status -1. U slučaju uspeha, ona treba da vrati status 0. Tipovi `uint16` i `uint32` predstavljaju neoznačene 16-bitne, odnosno 32-bitne cele brojeve, respektivno. |