Skip to content

Commit

Permalink
March 2023 colloquia.
Browse files Browse the repository at this point in the history
  • Loading branch information
KockaAdmiralac committed Mar 30, 2023
1 parent 1653c70 commit 3bc28f5
Show file tree
Hide file tree
Showing 2 changed files with 195 additions and 0 deletions.
97 changes: 97 additions & 0 deletions os1/2023/3/k1-sol.md
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;
}
```
98 changes: 98 additions & 0 deletions os1/2023/3/k1.md
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.

0 comments on commit 3bc28f5

Please sign in to comment.