Dobry den,<br>
<br>
>> Cilem 2. semestralni prace je rozsirit jadro z 1. semestralni prace<br>
<br>
Kde vezmeme to jadro - vysledek 1. semestralni prace?<br>
<br>
Diky<br>
<br>
Premek Paska<br><br><div><span class="gmail_quote">On 11/13/05, <b class="gmail_sendername">Lubomír Bulej</b> <<a href="mailto:bulej@nenya.ms.mff.cuni.cz">bulej@nenya.ms.mff.cuni.cz</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Dobry den,<br><br>v priloze najdete zadani 2. semestralni prace. Testy k 2. semestralni praci<br>budou k dispozici behem pristiho tydne. Pripadne dotazy a pripominky smerujte<br>prosim do konference.<br><br><br>Lubomir Bulej
<br><br><br><br>Zadani 2. semestralni prace: -------------------------------------------------<br><br>  Cilem 2. semestralni prace je rozsirit jadro z 1. semestralni prace o<br>  spravu fyzicke pameti a mapovani virtualni pameti do fyzicke. Zadani ma
<br>  formu rozhrani, ktere je nutno naimplementovat. K zajisteni rozumne urovne<br>  funkcnosti pro navazujici skupiny je nutne, aby implementace prosla sadou<br>  testu, ktere overuji funkcnost implementace.<br><br>  Ukolem bude naprogramovat:
<br><br>    * alokator oblasti virtualni pameti<br>    * mapovani virtualni pameti do fyzicke<br>    * pristup vlaken do virtualniho adresoveho prostoru<br>    * obsluhu vyjimek TLB<br><br><br>  Pokud zadani nespecifikuje nejaky detail, je zavazne chovani, ktere
<br>  ocekavaji testy. Pokud testy dane chovani netestuji, zadani si podle<br>  uvazeni dodefinujte a sve rozhodnuti zdokumentujte.<br><br>  Obecne pozadavky tykajici se deklarace a pouzivani chybovych kodu,<br>  definice zakladnich typu pouzivanych v zadani a pozadavky na formu
<br>  zdrojovych textu jsou shodne se zadanim 1. semestralni prace.<br><br><br>  Virtualni adresovy prostor procesoru<br>  ------------------------------------<br><br>    V zavislosti na aktualnim rezimu (user, supervisor, kernel) je virtualni
<br>    adresovy prostor procesoru MIPS R4000 rozdelen na nekolik segmentu.<br><br>    V uzivatelskem rezimu (user mode) je pristupny pouze segment USEG v<br>    rozsahu adres [0x00000000,0x800000000), ktery je mapovany do fyzicke
<br>    pameti pres TLB. Pristup na adresu mimo USEG vyvola vyjimku Address<br>    Error.<br><br>    V rezimu supervizora (supervisor mode) jsou definovany segmenty SUSEG v<br>    rozsahu adres [0x00000000,0x80000000), a segment SSEG v rozsahu adres
<br>    [0xC0000000,0xE00000000). Adresy v obou segmentech jsou mapovany do<br>    fyzicke pameti pres TLB, pricemz segment SUSEG je analogii segmentu USEG<br>    v uzivatelskem rezimu. Pristup na adresy mimo SUSEG a SSEG vyvola
<br>    vyjimku Address Error.<br><br>    A konecne v rezimu jadra (kernel mode) jsou definovany segmenty KUSEG<br>    v rozsahu adres [0x00000000,0x80000000), KSEG0 v rozsahu adres<br>    [0x80000000,0xA0000000), KSEG1 v rozsahu adres [0xA0000000,0xC0000000),
<br>    KSSEG/KSEG2 v rozsahu adres [0xC0000000,0xE0000000) a KSEG3 v rozsahu<br>    adres [0xE0000000,0xFFFFFFFF]. Adresy v segmentech KUSEG, KSSEG a KSEG2<br>    jsou mapovany do fyzicke pameti pres TLB, pricemz segmenty KUSEG resp.
<br>    KSSEG jsou analogii segmetu USEG resp. SSEG v uzivatelskem rezimu resp.<br>    rezimu supervizora. Adresy v segmentech KSEG0 a KSEG1 jsou mapovany do<br>    fyzicke pameti primo (pouze odectenim pocatecni adresy segmentu).
<br>    Virtualni adresy segmentu KSEG0 jsou tedy mapovany na fyzicke adresy v<br>    rozsahu [0x00000000,0x80000000), podobne je to i v pripade KSEG1.<br>    Na realnem systemu se segmenty KSEG0 a KSEG1 lisi take v tom, ze
<br>    pristup na adresy KSEG0 obchazi cache procesoru.<br><br><br>  Virtualni adresovy prostor procesu<br>  ----------------------------------<br><br>    V kontextu operacniho systemu je virtualni adresovy prostor procesu,
<br>    nebo take mapa virtualni pameti (address space, virtual memory map, vmm),<br>    datova struktura, ktera udrzuje informace o vyuziti adresoveho prostoru.<br><br>    Rozdeleni virtualniho adresoveho prostoru procesoru na segmenty je
<br>    pevne dane. Protoze se zpracovani virtualnich adres procesorem v<br>    jednotlivych segmentech lisi, je virtualni adresovy prostor procesu<br>    typicky alokovan po oblastech (virtual memory area, vma) uvnitr techto
<br>    segmentu. Oblasti virtualni pameti reprezentuji souvisly blok adres ve<br>    virtualnim adresovem prostoru. V zavislosti na tom, v jakem segmentu<br>    adresoveho prostoru procesoru se urcita oblast nachazi, je pak mapovani
<br>    rozsahu virtualnich adres oblasti do fyzicke pameti bud pevne dane<br>    (pripad segmentu KSEG0 a KSEG1) nebo definovane uzivatelem (operacnim<br>    systemem), ktery ma moznost ovlivnovat obsah TLB.<br><br>    Virtualni adresovy prostor procesu je jednim z prostredku sdilenych
<br>    vlakny uzivatelskeho procesu. Z bezpecnostnich duvodu ma kazdy proces<br>    operacniho systemu svuj vlastni virtualni adresovy prostor a tedy i<br>    mapovani do fyzicke pameti.<br><br>    Zaklad jadra z 1. semestralni prace dosud pracuje pouze s nezavislymi
<br>    vlakny, ktere bezi v rezimu jadra. Pro nasledny prechod k procesum s<br>    vice vlakny bezicimi v uzivatelskem rezimu (napln 3. semestralni prace)<br>    je ovsem nejprve nutne vytvorit podporu pro virtualizaci pameti, jeji
<br>    mapovani do fyzicke pameti a sdileni tohoto mapovani vlakny.<br><br><br>  Pristup vlaken do virtualniho adresoveho prostoru<br>  -------------------------------------------------<br><br>    Rozsirte stavajici implementaci vlaken v jadre o podporu pristupu
<br>    k virtualni pameti mapovane pres TLB v ramci virtualniho adresoveho<br>    prostoru.<br><br>    Pro ucely testovani implementujte funkci:<br><br>    * int thread_create_new_map (<br>          thread_t * thread_ptr, void (* thread_start) (void *), void * data)
<br><br>      Funkce vytvori nove vlakno podobne jako thread_create s tim rozdilem,<br>          ze
pro vlakno vytvori novy virtualni adresovy prostor. Nove vlakno tedy<br>          nebude sdilet mapovanou virtualni pamet s volajicim vlaknem.<br><br>    Funkce thread_create_new_map do jiste miry supluje funkci process_create
<br>    z rozhrani pro vytvareni a spravu procesu, jehoz zadani a implementace<br>    je naplni 3. semestralni prace.<br><br><br>  Sprava oblasti virtualni pameti<br>  -------------------------------<br><br>    Sprava oblasti virtualni pameti zahrnuje alokaci, manipulaci a
<br>    uvolnovani oblasti virtualni pameti v kontextu virtualniho adresoveho<br>    prostoru prave beziciho vlakna. Oblasti se nesmi prekryvat, velikost a<br>    zacatek oblasti musi byt zarovnan na nejmensi velikost stranky
<br>    podporovanou procesorem, v pripade MIPS R4000 tedy 4 KiB.<br><br>    Pro spravu oblasti virtualni pameti pouzijte vhodnou datovou strukturu,<br>    pricemz duraz je kladen na rozumne rychle nalezeni oblasti virtualni
<br>    pameti k dane virtualni adrese.<br><br>    * int vmalloc (void ** from, size_t size, uint flags)<br><br>      Funkce alokuje oblast ve virtualnim adresovem prostoru o velikosti<br>      @size bajtu, pro tuto oblast alokuje fyzickou pamet a vytvori mapovani
<br>      prave alokovane virtualni pameti do fyzicke.<br><br>      V zavislosti na hodnote bitoveho priznaku VF_VIRT_ADDR v argumentu<br>      @flags funkce bud automaticky zvoli vhodnou adresu zacatku oblasti<br>      virtualni pameti a vrati ji ve @from (hodnota VF_VA_AUTO), nebo se
<br>      pokusi vytvorit oblast na adrese zadane volajicim ve @from (hodnota<br>      VF_VA_USER).<br><br>      Bitove pole VF_ADDR_TYPE v argumentu @flags urcuje typ segmentu<br>      virtualniho adresoveho procesoru, ve kterem bude virtualni oblast
<br>      alokovana. Hodnoty bitoveho pole pro jednotlive segmenty jsou<br>      VF_AT_KUSEG, VF_AT_KSEG0, VF_AT_KSEG1, VF_AT_KSSEG a VF_AT_KSEG3.<br>      Alokace v segmentech KSEG0 a KSEG1 se vzajemne vylucuji, pokud jsou
<br>      mapovany na stejne fyzicke adresy.<br><br>      Binarni format argumentu @flags je dan makry VF_VA_SIZE, VF_VA_SHIFT<br>      a VF_AT_SIZE, VF_AT_SHIFT, ktere specifikuji velikost bitoveho pole<br>      a jeho pozici ve slove.
<br><br>      Vraci EOK pokud byla pamet alokovana a namapovana, EINVAL pokud<br>      nebylo mozne alokovat oblast se zacatkem na adrese @from v danem<br>      segmentu virtualniho adresoveho prostoru procesoru, nebo pokud
<br>      @from ci @size nejsou zarovnany, ENOMEM pokud neni dostatek fyzicke<br>      pameti k provedeni operace.<br><br>    * int vfree (void * from)<br><br>      Funkce zrusi mapovani pameti pro oblast se zacatkem na adrese @from,
<br>      ktera byla predtim vytvorena volanim vmalloc(). Dale uvolni fyzickou<br>      pamet, do ktere byla oblast mapovana a zrusi prislusnou oblast<br>      virtualni pameti.<br><br>      Vraci EOK pokud byla pamet uvolnena a mapovani zruseno, EINVAL pokud
<br>      @from neukazuje na zacatek oblasti vytvorene volanim vmalloc().<br><br>    * int vresize (void * from, size_t size)<br><br>      Funkce zvetsi/zmensi velikost oblasti virtualni pameti jejiz zacatek<br>      lezi na adrese @from na novou velikost @size bajtu. Nesmi pritom dojit
<br>      k prekryvu dvou ruznych oblasti virtualni pameti.<br><br>      Vraci EOK, pokud byla velikost oblasti uspesne zmenena, EINVAL<br>      pokud @from neukazuje na platnou oblast, pokud by melo dojit k<br>      prekryvu s jinou oblasti v dusledku zvetseni, nebo pokud neni nova
<br>      velikost zarovnana, ENOMEM pokud nebylo mozne oblast zvetsit v kvuli<br>      nedostatku pameti.<br><br>    * int vremap (void * from, void * to)<br><br>      Funkce premapuje oblast zacinajici na adrese @from na adresu @to.
<br>      Velikost oblasti a posloupnost mapovani virtualnich stranek na fyzicke<br>      zustava zachovana. Prekryti virtualnich adres v oblasti @from a @to<br>      je pripustne.<br><br>      Vraci EOK pokud bylo premapovani uspesne, EINVAL pokud na adrese
<br>      @from neni platna oblast, pokud @to neni zarovnana adresa, nebo pokud<br>      by pri presunu melo dojit k prekryti jiz existujici oblasti.<br><br>    * int vmerge (void * area1, void * area2)<br><br>      Funkce spoji oblasti @area1 a @area2 do jedne oblasti, pokud spolu
<br>      sousedi. Zacatek nove oblasti je na nizsi z pocatecnich adres obou<br>      oblasti. Vraci EOK pokud bylo spojeni provedeno, EINVAL pokud jsou<br>      jedna nebo obe oblasti neplatne, nebo pokud spolu nesousedi.
<br><br>    * int vsplit (void * from, void * split)<br><br>      Funkce rozdeli oblast zacinajici na adrese @from na dve sousedici<br>      oblasti, pricemz nove vznikla oblast bude zacinat na adrese @split.<br><br>      Vraci EOK pokud bylo rozdeleni uspesne, EINVAL pokud @from neukazuje
<br>      na zacatek existujici oblasti, pokud @split neni uvnitr rozdelovane<br>      oblasti, nebo pokud hodnota @split neni zarovnana.<br><br><br>  Obsluha vyjimek TLB<br>  -------------------<br><br>    Pri prekladu virtualni adresy na fyzickou muze procesor vyvolat dva
<br>    druhy vyjimek. Prvni z vyjimek je TLB Refill, ktera je vyvolana v<br>    pripade, ze pro pozadovanou virtualni adresu nebyl v TLB nalezen zaznam<br>    s odpovidajici fyzickou adresou. Druhou z vyjimek je TLB Invalid, ktera
<br>    je vyvolana v pripade, ze v TLB sice existuje polozka pro pozadovanou<br>    virtualni adresu, ale tato polozka je neplatna.<br><br>    Obsluha obou typu vyjimek by mela nalezt mapovani pro prislusnou virtualni<br>
    adresu a naplnit TLB. Pokud nebude pro danou virtualni adresu mapovani<br>    existovat, ocekava se, ze jadro vypise varovne hlaseni a vlakno, ktere<br>    vyjimku vyvolalo, zrusi.<br><br>    Pozn.: Moznost oznacit polozku TLB jako neplatnou lze pouzit napr. pri
<br>    implementaci copy-on-write mechanizmu nebo swapovani, v ramci zadani 2.<br>    semestralni prace vsak pro jeho vyuziti neni prostor.<br><br><br>  Uprava stavajiciho alokatoru pameti<br>  -----------------------------------
<br><br>    Stavajici alokator pameti s rozhranim malloc/free alokuje pamet z haldy<br>    umistene v segmentu KSEG0 virtualniho adresoveho prostoru procesoru.<br>    Protoze soucasne s timto alokatorem bude stranky fyzicke pameti alokovat
<br>    take volani vmalloc(), je nutne zajistit, aby stejnou stranku fyzicke<br>    pameti nepouzival alokator haldy a oblast virtualni pameti vytvorena<br>    volanim vmalloc().<br><br>    Upravte stavajici alokator tak, aby nedochazelo k uvedenym kolizim a
<br>    zaroven aby alokator vracel pouze pamet ze segmentu KSEG0 virtualniho<br>    adresoveho prostoru procesoru, tj. aby bylo mozne k alokovane pameti<br>    pristupovat bez pouziti TLB.<br><br><br>  Kopirovani pameti mezi vlakny
<br>  -----------------------------<br><br>    Pro testovaci ucely implementujte nasledujici funkce:<br><br>    * int copy_from_thread (thread_t thr,<br>          void * dest, const void * src, size_t len)<br><br>      Funkce zkopiruje data z virtualni pameti vlakna @thr do virtualni
<br>      pameti volajiciho vlakna. Vraci EOK pokud byla data zkopirovana,<br>      EINVAL pokud je identifikace zdrojoveho vlakna neplatna.<br><br>    * int copy_to_thread (thread_t thr,<br>          void * dest, const void * src, size_t len)
<br><br>      Funkce zkopiruje data z virtualni pameti volajiciho vlakna do<br>      virtualni pameti vlakna @thr. Vraci EOK pokud byla data zkopirovana,<br>      EINVAL pokud je identifikace zdrojoveho vlakna neplatna.<br>
<br><br>  Integrace s testy<br>  -----------------<br><br>  K integraci s testy vytvorite hlavickovy soubor assignment-2.h, ktery bude<br>  obsahovat deklarace vsech vyse uvedenych funkci. Typicky bude obsahovat<br>  #include direktivy, ktere zajisti vlozeni vasich hlavickovych souboru s
<br>  prislusnymi deklaracemi.<br><br>  Dale musi soubor obsahovat deklaraci funkce assignment_test (void),<br>  kterou zavolate z vaseho jadra.<br><br>--<br>Posledni modifikace: 2005/11/13 22:22<br><br><br>_______________________________________________
<br>OSy mailing list<br><a href="mailto:OSy@nenya.ms.mff.cuni.cz">OSy@nenya.ms.mff.cuni.cz</a><br><a href="http://nenya.ms.mff.cuni.cz/mailman/listinfo/osy">http://nenya.ms.mff.cuni.cz/mailman/listinfo/osy</a><br><br><br>
</blockquote></div><br>