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()uscheduler()nakon uključivanja prekida - prelaz iz RUNNABLE u RUNNING.put()uyield()- kad proces predaje kontekst nekom drugom procesu.put()uuserinit()- kad se kreira prvi korisnički proces.put()ufork()- kad se forkuje nov proces.put()uwakeup()- prelaz iz SLEEPING u RUNNABLE.put()ukill()- kad proces treba da se završi treba da ga probudimo.
Implementiranje preotimanja po vremenskom kvantumu
Okruženje
Makefile
Debagovanje korisničkih programa
Da bi debagovali korisničke programe, morate u konfiguraciji za debagovanje u okruženju promeniti binarni fajl koji će gdb-multiarch da debaguje (podrazumevano sam kernel).
- Meni Run → Edit Configurations → Remote Debug → Debug (ili vaš naziv konfiguracije) → Symbol file promenite na binarni fajl korisničkog programa (nalaze se u direktorijumu
/user/i svi počinju sa donjom crtom). - Postavite breakpoint, pokrenite OS kao i obično i u njemu pokrenite željeni program.
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 |
| |
| 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 |
|
| f | Stranična greška pri pisanju/atomičnoj instrukciji |
|
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.