[OSy] Zadani 4. tematu semestralni ulohy
Martin Decky
decky at d3s.mff.cuni.cz
Thu Dec 3 10:06:28 CET 2015
Vazeni kolegove,
v priloze tohoto emailu naleznete rozsirene zadani 4. semestralni ulohy
z predmetu Operacni systemy. Prosim, venujte tomuto zadani pozornost i v
tom pripade, ze mate v planu prijit na nejblizsi cviceni a resit
prezencni ulohu -- zadani 4. prezencni ulohy se bude take tykat tematu
ovladani zarizeni a bude vyzadovat znalost latky z prednasky (pripadne z
doporucene literatury, ktera je uvedena na konci rozsireneho zadani).
Specialne doporucuji nastudovat si problematiku obsluhy hardwarovych
preruseni na procesoru MIPS R4000.
Chtel bych se omluvit za to, ze soucasti Kalista verze 0.9.5, ktera je
ke stazeni z webu, zatim neni jednotkovy test pro otestovani spravne
funkce ovladace blokoveho zarizeni. Z casovych duvodu a kvuli jinym
pracovnim povinnostem se mi zatim nepodarilo test dopracovat do takove
podoby, se kterou bych byl spokojen. Pokusim se test dokoncit a
zpristupnit behem nasledujicich nekolika dnu. Dekuji za pochopeni.
Pokud se rozhodnete implementovat rozsirene zadani 4. semestralni ulohy,
tak sva reseni muzete odevzdavat az do 17. 12. 2015 (vcetne). Odevzdani
provadejte opet tak, ze svou modifikaci Kalista (tj. vse, co je potreba
ke spusteni, otestovani a ohodnoceni Vaseho reseni) zabalite do archivu
(ZIP, TAR.BZ2 apod.) a poslete jako prilohu na emailovou adresu
nswi004 at d3s.mff.cuni.cz
Opet DURAZNE APELUJEME, abyste vypracovani reseni nenechavali na
posledni chvili a meli tak pripadne realnou moznost reagovat na nasi
zpetnou vazbu k Vasemu reseni, Podrobneji viz zadani 1. ulohy [1].
V pripade libovolnych dotazu k zadani nebo k formalnim zalezitostem
nevahejte vyuzit tento mailing list.
[1] https://d3s.mff.cuni.cz/pipermail/osy/2015-October/002164.html
S pozdravem
Martin Decky
-------------- next part --------------
========================================================================
Semestralni uloha z predmetu
Operacni systemy
Tema 4.: Ovladani zarizeni
Rozsirene zadani
========================================================================
Datum zverejneni zadani: 3. 12. 2015
Datum odevzdani reseni: 17. 12. 2015
------------------------------------------------------------------------
Cilem 4. tematu semestralni ulohy je naprogramovat ovladac periferniho
vstupne/vystupniho zarizeni. Zadani ma formu rozhrani, ktere je nutno
naimplementovat, a je doplneno sadou jednotkovych testu, jimiz musi
implementace uspesne projit.
Pri vypracovani vychazejte z vyukoveho jadra Kalisto ve verzi 0.9.5,
do ktereho doplnte chybejici funkcionalitu. Kalisto ve verzi 0.9.5 je
k dispozici ke stazeni z URL:
http://d3s.mff.cuni.cz/osy/download/kalisto-0.9.5.tar.bz2
Pokud zadani nespecifikuje nejaky detail, je zavazne chovani, ktere
ocekavaji testy. Pokud testy dane chovani netestuji, zadani si podle
uvazeni dodefinujte a sve rozhodnuti zdokumentujte pomoci vhodnych
komentaru ve zdrojovem kodu reseni.
Ovladace zarizeni ------------------------------------------------------
Ovladace zarizeni slouzi k zpristupneni vstupne/vystupnich periferii,
ktere na rozdil od zakladnich zdroju pocitacove architektury (jako je
procesor a pamet) tvori volitelnou a vysoce konfigurovatelnou soucast
hardware konkretniho pocitace.
Ovladace zarizeni obvykle poskytuji kodu, ktery je vyuziva, rozhrani
s urcitou mirou abstrakce. Tato abstrakce predevsim skryva konkretni
implementacni detaily rizeni konkretniho zarizeni za sadou obecnejsich
funkci spolecnych pro nejakou vetsi mnozinu zarizeni stejneho nebo
podobneho typu (blokova zarizeni, znakova zarizeni, graficka zarizeni
atd.). Konkretni granularita techto mnozin podobnych zarizeni a podoba
danych abstrakci predstavuje vyznamny diferenciacni faktor mezi
realnymi operacnimi systemy.
Dulezitou roli ovladace zarizeni je take zprostredkovani komunikace
mezi pozadavky z operacniho systemu (rozhrani se software) a mezi
pozadavky ze zarizeni (rozhrani s hardware), vcetne efektivniho rizeni
ruzne miry paralelismu na obou stranach (omezeni aktivniho cekani a
pollingu jen na nezbytne nutne pripady). Z pohledu softwarove
architektury lze tedy ovladac zarizeni rozdelit na dve zakladni casti:
* Cast rozhrani se software
Obcas take nazyvana top half. Jedna se obvykle o synchronni rozhrani
volane pomoci beznych funkci z kodu operacniho systemu, kterym se
zadavaji pozadavky na vykonani operaci se zarizenim, resp. zjistuje
se stav zarizeni.
V nekterych pripadech muze aplikacni rozhrani top half poskytovat
asynchronni funkce. To znamena, ze samotne zadani pozadavku volajici
vlakno nezablokuje po celou dobu, kdy hardware pozadavek vykonava,
ale o vysledku dane operace je volajici vlakno notifikovano nejakym
softwarovym asynchronnim mechanismem (priznakem, signalem apod.).
Dulezitou ulohou top half je alokace, sprava a dealokace datovych
struktur jednotlivych pozadavku ("frontovani" pozadavku vcetne
pripadne prioritizace pozadavku), synchronizace fyzickeho pristupu
k ridicim registrum zarizeni a udrzovani tzv. "soft state", tedy
softwaroveho obrazu stavu hardwaru.
* Cast rozhrani s hardware
Obcas take nazyvana bottom half. Jedna se o asynchronni rozhrani
aktivovane na zaklade zmeny stavu zarizeni, ktere je obvykle
indikovano hardwarovymi prerusenimi. Pokud je zmena stavu zarizeni
reakce na uspesne (ci neuspesne) vyrizeni pozadavku zadaneho z top
half, je ulohou bottom half sparovani vysledku operace se strukturou
popisujici tento pozadavek, aktualizace "soft state" a notifikace
prislusne top half instance ovladace (obvykle probuzenim prislusneho
vlakna).
U jednoduchych zarizeni byva vesktery kod bottom half implementovan
v ramci nereentrantni obsluhy hardwaroveho preruseni. U zarizeni se
slozitejsim rizenim (napr. zarizeni, ktera podporuji vyrizovani vice
paralelnich pozadavku soucasne) a predevsim u zarizeni, ktera casto
sami generuji autonomni pozadavky (napr. sitova rozhrani), obsahuje
obsluha preruseni jen nejnutnejsi kod pro precteni stavu zarizeni,
zatimco casove a logicky narocnejsi aktualizace "soft state" muze
byt ruznymi mechanismy odlozena na vykonani pozdeji.
Toto volitelne odlozene zpracovani asynchronnich pozadavku zarizeni
ma (pres jistou rezii) vyznamny vliv na snizeni latence obsluhy
preruseni a na snizeni latence celeho systemu, ktera je vyznamne
ovlivnena prave delkou neprerusitelnych obsluznych rutin preruseni.
Nekteri navrhari operacnich systemu povazuji odlozene zpracovani za
treti cast softwarove architektury ovladace zarizeni.
Obecne pozadavky -------------------------------------------------------
Nasledujici doporuceni odrazi pozadavky na uroven zdrojovych textu,
ktere budou hodnoceny pri odevzdani reseni ulohy.
- Vyhybejte se pouzivani numerickych konstant primo v kodu, nahradte
je makry.
- Pouzivejte prazdne radky a blokove komentare k oddeleni logickych
casti kodu.
- Pouzivejte vhodnym zpusobem mezery pro zprehledneni a usnadneni
porozumeni kodu. Snazte se, aby styl vaseho kodu pokud mozno
odpovidal stylu jiz existujiciho kodu.
- Vyhybejte se psani prilis dlouhych funkci nebo funkci s prilis
velkou urovni vnorenych bloku.
- Vyhybejte se vytvareni zdrojovych souboru, ktere obsahuji
nesouvisejici funkce, pripadne umistovani zdrojovych souboru do
nevhodnych adresaru.
- Pouzivejte makra ci inline funkce k nahrade slozitych podminkovych
vyrazu.
- Pouzivejte jednotny jazyk pro komentare.
- Pouzivejte jednotny jazyk pro identifikatory funkci a promennych
a pro nazvy souboru.
- Pouzivejte systematicke identifikatory funkci a promennych.
Zadani ulohy -----------------------------------------------------------
V ramci jadra systemu Kalisto naimplementujte jednoduchy ovladac
blokoveho zarizeni ddisk [2]. Tento ovladac poskytuje uzivateli
obvykle synchronni (blokujici) rozhrani pro cteni a zapis jednotlivych
bloku zarizeni. Zarizeni ddisk umoznuje fyzicke provadeni nejvyse
jedne operace cteni ci zapisu v jednom okamziku.
Na druhou stranu, ovladac zarizeni ddisk by mel podporovat moznost
efektivniho zadavani vice nezavislych pozadavku na cteni/zapis bloku
z vice nezavislych vlaken bez aktivniho cekani (tj. mel by si udrzovat
frontu pozadavku na zarizeni) a mel by tak byt pripraven na budouci
vyuziti zarizeni, jez dovede fyzicky vyrizovat vice nez jen jeden
pozadavek v jednom okamziku.
Obsluha vysledku kazdeho jednotliveho pozadavku by mela byt rizena
prerusenimi, ktera zarizeni ddisk generuje, a mela by se obejit bez
zbytecneho aktivniho cekani na zarizeni (pollingu) v synchronni casti
ovladace.
* int disk_get_nblocks(size_t *nblocks)
Funkce vrati v argumentu @nblocks pocet bloku blokoveho zarizeni
(velikost bloku v bytech je definovana konstantou DISK_BLOCK_SIZE,
ktera ma v souladu se specifikaci zarizeni ddisk hodnotu 512).
Navratova hodnota funkce je EOK v pripade uspesneho zjisteni poctu
bloku nebo vhodny chybovy kod v jinych pripadech.
* int disk_read(size_t block, void *data)
Funkce precte z blokoveho zarizeni blok s poradovym cislem @block
(bloky jsou indexovany od nuly) a vysledek ulozi do bufferu @data.
Volajici musi zajistit, ze ukazatel na buffer obsahuje virtualni
adresu bloku pameti o velikosti alespon DISK_BLOCK_SIZE. Uspesne
provedene operace cteni je indikovano navratovou hodnotou EOK. Pri
pozadavku na cteni bloku, ktery neni na blokovem zarizeni
k dispozici, vraci funkce navratovou hodnotu EINVAL. Dalsi chybove
stavy jsou indikovany jinymi vhodnymi chybovymi kody.
Behem cekani na vyrizeni pozadavku zarizenim funkce zablokuje
volajici vlakno. Aktivni cekani nebo polling zarizeni by se mel
omezit jen na zcela nejnutnejsi miru. Pokud zarizeni prave vykonava
predchozi pozadavek, novy pozadavek by mel byt zarazen do fronty
pozadavku (pro potencialni budouci rozsireni kodu o prioritizaci
a strategie razeni pozadavku ci rizeni hardwaru s podporou vice
paralelnich pozadavku).
* int disk_write(size_t block, void *data)
Funkce zapise na blokove zarizeni DISK_BLOCK_SIZE bytu z bufferu
@data. Data se ulozi do bloku s poradovym cislem @block (bloky jsou
indexovany od nuly). Uspesny zapis je indikovano navratovou hodnotou
EOK. Pri pozadavku na zapis bloku, ktery neni na blokovem zarizeni
k dispozici, vraci funkce navratovou hodnotu EINVAL. Dalsi chybove
stavy jsou indikovany jinymi vhodnymi chybovymi kody.
Behem cekani na vyrizeni pozadavku zarizenim funkce zablokuje
volajici vlakno. Aktivni cekani nebo polling zarizeni by se mel
omezit jen na zcela nejnutnejsi miru. Pokud zarizeni prave vykonava
predchozi pozadavek, novy pozadavek by mel byt zarazen do fronty
pozadavku (pro potencialni budouci rozsireni kodu o prioritizaci
a strategie razeni pozadavku ci rizeni hardwaru s podporou vice
paralelnich pozadavku).
Jednotkove testy -------------------------------------------------------
K overeni spravne funkcnosti implementace slouzi testy ulozene
v podstrome kernel/tests/ddisk zdrojoveho stromu Kalista 0.9.5.
Infrastruktura pro spousteni a vyhodnoceni techto jednotkovych testu
je implementovana pomoci skriptu tests-ddisk.sh. Pro splneni zadani je
potreba, aby reseni uspesne proslo vsemi dodanymi jednotkovymi testy,
pricemz neni dovoleno modifikovat logiku testu.
K integraci s jednotkovymi testy pridejte do hlavickoveho souboru
api.h vhodne #include direktivy, ktere zajisti vlozeni hlavickovych
souboru s potrebnymi deklaracemi.
Doporucena literatura --------------------------------------------------
[1] Studijni text k predmetu Operacni systemy, kapitola Device
Management, http://d3s.mff.cuni.cz/~ceres/sch/osy/text/ch04.html
[2] Dokumentace zarizeni ddisk v MSIMu,
http://d3s.mff.cuni.cz/~holub/sw/msim/reference.html#ddisk
[3] Wikipedia: Device driver,
https://en.wikipedia.org/wiki/Device_driver
[4] Wikipedia: Interrupt handler,
https://en.wikipedia.org/wiki/Interrupt_handler
More information about the NSWI004
mailing list