Buduci da nitko nema ideje sto se dogada ovdje i dobio sam par poruka da pomognem, pokusat cu objasniti najbolje sto mogu sto treba raditi u labosu. MASOVNA NAPOMENA: Ja ne znam je li ista od mojeg tocnog, ali to cu vidjet sutra na demonstraciji. Napravio sam najbolje sto znam i razumijem, a nemam vremena konstantno premisljati zbog nekolicine bodova. Takoder, ovo mozda nece biti primjenjivo za nagodinu.
Drugi labos se sastoji od 3 zadatka - 2 podzadatka za lab2a i 1 podzadatak za lab2b. Ogromna vecina toga je vec implementirana, i nije potrebno puno razmisljati ni koda pisati. Cak i dosta zadataka sto “moramo napraviti” suvec implementirani. Moje razumijevanje labosa i njene svrhe je ovakvo:
Za oba zadatka, mora se napraviti sudo make
i sudo ./load_shofer
. On ti stvara sve potrebne virtualne naprave, i ti tu ne trebas nista pisati i dodavati. U lab2a se te naprave zovu od /dev/shofer0
do /dev/shofer5
, dok se u lab2b nazivaju /dev/shofer_in
, /dev/shofer_out
te /dev/shofer_control
. U lab2a, virtualne naprave mogu obavljati read i write, dok u lab2b, svaka naprava ima ogranicena prava prema tekstu zadatka.
U ovome labosu (koliko znam) nema provjere plagijata jer pretpostavljam da nemamo niti znanja niti vremena da ovo implementiramo na raznolike nacine. To me navodi na to da je njima cilj da mi razumijemo teorijsku pozadinu napisanog C koda. Stoga, ako dodete s kodom, ali ne mozete suvislo odgovoriti na postavljena pitanja, vjerojatno ce te dobiti disproprocionalno niski broj bodova. Nemojte plagirati nego razumijte kod i budite ga sposobni izmijeniti.
Podzadaci:
Podzadatak: Potrebno je loadati modul preko bash skripte, te napisati svoj .c program koji cita iz spomenutih naprava. Za doticni .c program iskoristite ovaj kod: https://man7.org/linux/man-pages/man2/poll.2.html. Taj kod na dnu stranice doslovno copy-pasteajte i compileajte. On ce zadovoljavati svrhu 1. podzadatka, ali vrlo nezgodno; program slusa samo naprave koje su navedene u komandnoj liniji pri pokretanju c programa (./citac.o /dev/shofer0 /dev/shofer1 ... /dev/shofer5)
. Medutim, moj savjet je da ne budete lijeni nego isprogramirajte tako da se program prilagodi zadatku. Dodajte dinamicno slusanje naprava preko varijable (npr. imate string /dev/shoferX
i dinamicno mijenjate char X
u broj ovisno u kojoj ste iteraciji u petlji, iako nemojte me plagirati na ovome pls). Kada ste gotovi, pokrenite slusanje s jednom konzolom, i na drugoj posaljite poruke slusajucim napravama s echo "tekst za primjer" > /dev/shofer2
. Ocito, 2
je placeholder broj te mozete napisati skriptu koja ce ovo automatizirati u svhui testiranja. Komentirajte dijelove koda da sami sebi dokazete da razumijete.
Podzadatak: Potrebno je loadati modul preko bash skripte i napisati svoj .c program, ali ovaj program ce piatie u naprave. Duplicirajte .c file iz prvog podzadatka i preimenujte ga. Izmijenite sve zastavice tako da je relevantno za pisanje (O_RDONLY-
> O_WRONLY
, POLLIN
-> POLLOUT
, read(...)
-> write(...)
). Vas zadatak je svakih 5 sekundi (dokle god uopce ima veza, ali taj dio nije toliko relevantan): napraviti poll()
, pregledati revent
zastavice svakog aktivnog fd
te izabrati nasumicno jedan fd
koji je spreman za pisanje i napisati random znak u njega. Ova izvedba je malo kompliciranija, ali to vam je osnovni pseduokod. Na koji nacin ce te implementirati provjeru zastavica, nasumicni odabir i pisanje je na vama. Sada, ako pokrenete oba programa paralelno, svakih 5 sekundi ce program iz ovog podzadatka randomly poslat poruku programu iz prvog podzadatka preko zajednicke naprave.
Podzadatak: Ovaj zadatak je malo zbunjuci, ali pazljivo pratite. Postoje tri virtualne naprave s zajednickim spremnikom. Cilj ovog podzadatka je manipulacija tim meduspremnikom koristeci naprave. Iz tog razloga postoje navedene tri naprave s ogranicenim pravima jer svaka radi specificnu funkciju s meduspremnikom. Na svu srecu, preko sudo ./load_shofer
stvaraju se doticne naprave pa tu ne moramo nista. Medutim, mi u ovom zadatku modificiramo sâm modul, ali samo i iskljucivo njega. Mijenja se samo shofer.c
i to na tri mjesta gdje su zakomentirana “todo”. Svaki put kada zelimo provjeriti funkcionalnost, potrebno je izvrsiti sudo make
i sudo ./load_shofer
. Modul shofer.c
je napisan tako da bilo koja promjena u meduspremniku je logirana na dnu /var/kern.log
i upravo tu vidite funkcionira li vam program ili ne. Alaram/timer za prebacivanje jednog znaka svakih 5 sekundi je vec implementiran. Medutim, to je samo 1 znak svakih 5 sekundi, sto je prilicno sporo, pa tu dolazi ioctl
funkcija, cija je svrha da prebacuje dan broj bajtova s meduspremnika. To koristimo tako da compile-amo ioctl.c
i pokrenemo u konzoli ./ioctl.o /dev/shofer_control 10
gdje 10
predstavlja broj bajtova koji se prebacuju s meduspremnika. Dakle, jedina svrha naprave /dev/shofer_control
je da komunicira s ioctl()
za brze prebacivanje bajtova sto radi preko funkcije control_ioctl()
u shofer.c
. Svaka naprava ima svoje specificne funkcije koje koristi. Naime, sada ce te primjetiti u shofer.c
da svaki “todo” ima “slican” komentar nakon njega, i to je istina sto komentar tvrdi; potrebno je copy paste-ati kompletan kod slicne funkcije u doticnu funkciju i izmijeniti par redova. U shofer_open_write
izmijenis zastavicu O_RDONLY
, u shofer_write
izmijenis out_buff
->in_buff
te kfifo_to_user
-> kfifo_from_user
, a u control_ioctl()
umjesto da se prebacuje jedan bajt, prebacuje se predani broj cmd
bajtova iz ioctl.o
programa. Dakle, za svako testiranje, pokrenete sudo ./load_shofer
, napravite echo "tekst za primjer" > /dev/shofer_in
i pratite u periodicno (timer) i naglo (ioctl) prebacivanje bajtova u /var/kern.log
.
Sretno svima koji jos rade ovaj labos, i zao mi je ako ista od ovog moje netocno.