OS2/Projekat 2022
Projekat 2022. godine je prvi projekat iz Operativnih sistema 1 i 2 u kom se koristi xv6 operativni sistem na RISC-V arhitekturi. U ovom vodiču se nalaze korisni saveti pri izradi projekta.
Dodavanje interfejsa raspoređivača
Interfejs definisan postavkom za raspoređivač je isti onaj iz školskog jezgra:
struct proc *get(); // Дохватање спремног процеса из реда чекања
void put(struct proc *); // Убацивање спремног процеса у ред чекања
xv6 u sebi sadrži Round-robin raspoređivač direktno implementiran u funkciji scheduler(). Neophodno je zameniti ovaj algoritam sa traženim interfejsom. Mesta od značaja su ona gde proces menja stanje.
- get() u scheduler() nakon uključivanja prekida - prelaz iz RUNNABLE u RUNNING.
- put() u yield() - kad proces predaje kontekst nekom drugom procesu.
- put() u userinit() - kad se kreira prvi korisnički proces.
- put() u fork() - kad se forkuje nov proces.
- put() u wakeup() - prelaz iz SLEEPING u RUNNABLE.
- put() u kill() - kad proces treba da se završi treba da ga probudimo.
Implementiranje preotimanja po vremenskom kvantumu
Okruženje
Makefile
Debagovanje korisničkih programa
Promena učestanosti tajmerskog prekida
U svrhu testiranja na odbrani je ponekad traženo da se poveća učestanost prekida radi preciznijih merenja performansi (pomoću sistemskog poziva uptime()) i vidljivijeg efekta raspoređivanja. Interval tajmera se može promeniti u fajlu start.c u funkciji timerinit().
Tumačenje scause i sepc
Preskočene su rezervisane vrednosti.
| scause vrednost | Značenje | Potencijalni problem |
|---|---|---|
| 0 | Adresa u PC nije poravnata | Kernel je promenio kontekst u nevalidan proces (verovatno je raspoređivač vratio nevalidan proces). |
| 1 | Greška u pristupu instrukciji | |
| 2 | Ilegalna instrukcija | Ukoliko koristite floating-point tipove, oni nisu podržani na ovoj implementaciji RISC-V. |
| 3 | Breakpoint |
Ne bi trebalo da se pojavi kao razlog za paniku. |
| 4 | Adresa sa koje se čita nije poravnata | Loš pokazivač. |
| 5 | Greška u pristupu pri čitanju | |
| 6 | Adresa u koju se piše nije poravnata Atomična instrukcija pristupa adresi koja nije poravnata | |
| 7 | Greška u pristupu pri pisanju/atomičnoj instrukciji. | |
| 8 | ecall iz korisničkog režima | Ne bi trebalo da se pojavi kao razlog za paniku. |
| 9 | ecall iz supervizorskog (kernel) režima | Ne bi trebalo da se dešava uopšte u xv6. |
| c | Stranična greška pri učitavanju instrukcije |
Kernel je promenio kontekst u nevalidan proces (verovatno je raspoređivač vratio nevalidan proces). |
| d | Stranična greška pri čitanju | Kernel je promenio kontekst u nevalidan proces (verovatno je raspoređivač vratio nevalidan proces). Loš pokazivač. |
| f | Stranična greška pri pisanju/atomičnoj instrukciji | Kernel je promenio kontekst u nevalidan proces (verovatno je raspoređivač vratio nevalidan proces). Loš pokazivač. |
Vrednost sepc registra označava vrednost PC u trenutku kad je nastala greška. Može se tačno pronaći mesto u kodu pretraživnjem ove adrese u fajlu kernel.asm koji sadrži i C kod kernela i generisani RISC-V asembli sa tačnom adresom instrukcija.