OS2/Projekat 2022

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

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.

  1. get() u scheduler() nakon uključivanja prekida - prelaz iz RUNNABLE u RUNNING.
  2. put() u yield() - kad proces predaje kontekst nekom drugom procesu.
  3. put() u userinit() - kad se kreira prvi korisnički proces.
  4. put() u fork() - kad se forkuje nov proces.
  5. put() u wakeup() - prelaz iz SLEEPING u RUNNABLE.
  6. 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

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 RunEdit ConfigurationsRemote DebugDebug (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 sa qemu-gdb i u njemu pokrenite izabrani 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
  • 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.