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>