[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