[OSy] Dotazy k 3. rozsirenemu zadani

Petr Tůma petr.tuma at d3s.mff.cuni.cz
Tue Nov 24 09:03:56 CET 2015


Dobry den,

>   * Jak priradit vlaknu cislo ASID? Podle manualu procesoru se cislo
>     ASID nastavi do registru EntryHi pri vyjimkach TLB refill a TLB
>     invalid. To znamena, ze vlakno musi mit tento identifikator na
>     predem danem miste. Ja si myslim, ze je treba nastavit spodnich 8
>     bitu v registru t2 (= EntryHi) v kontextu na pocatku zasobniku pri
>     vytvareni vlakna. Je to spravne?

Vase verze Kalista pri prepinani kontextu ASID neuklada ani nenastavuje, 
toto je neco co musite doplnit. Jedna z moznosti, jak to udelat, je 
ukladat a obnovovat ASID jako soucast kontextu vlakna (a pak byste asi 
prirozene rozsiril strukturu, do ktere se uklada kontext, o nove pole, 
viz context_t).

V zadani mate situaci zjednodusenou tim, ze vase vlakna bezi vzdy v 
KSEG0, takze si muzete dovolit nastavit ASID i pozdeji nez behem 
prepinani kontextu uvnitr cpu_switch_context.

>   * Podle zadani mame uvazovat, ze nam staci cisla ASID pro vsechna
>     vlakna. Jedna se o vlakna spustena v jednu chvili nebo za celkovou
>     dobu behu operacniho systemu (jedna se mi o pridelovani techto cisel
>     - zda staci jedna promenna nebo je treba mit napriklad bitmapu a
>     pridelovat i volna cisla dobehlych threadu)?

Presneji receno, zadani rika, ze nikdy nebude vice adresovych prostoru 
nez kolik je ruznych ASID, o vlaknech se v danem miste nemluvi. Protoze 
vice vlaken muze take sdilet stejny adresovy prostor, asi bych zadani 
implementoval tak, ze bych adresove prostory spravoval oddelene od 
vlaken a kazde vlakno by melo ve sve strukture referenci na svuj 
adresovy prostor. A kazdy adresovy prostor by mel pridelene ASID (zadani 
mi praci ulehcuje v tom, ze ASID mohu pridelit staticky v okamziku 
vytvareni adresoveho prostoru, protoze mam zaruceno, ze vzdy bude nejaky 
nepouzity).

>   * Kde v pameti uchovavat strankovaci tabulky? Podle me je treba je mit
>     v pameti KSEG0, protoze jinak by mohl nastat pripad, kdy pri obsluze
>     vyjimky TLB refill potrebuji pristoupit na adresu (strankovaci
>     tabulky), ktera take v TLB neni, coz by po chvili pravdepodobne
>     vyustilo v pad kernelu. Je nejaka jina moznost jak toto resit?

Ukladani strankovacich tabulek do KSEG0 je rozhodne rozumne. V principu 
lze asi vymyslet i komplikovanejsi reseni, ale v KSEG0 je spousta mista 
(pri bezne velikosti stranek je pomer mezi velikosti strankovaci tabulky 
a velikosti mapovane pameti treba 1:1024, takze dokud nebudete chtit 
spoustet procesy s uhrnem nejakych stovek GB mapovane pameti, bude to 
stacit).

>   * Co ma presne delat vma_map() v KSEG0? Vratit adresu ziskanou z
>     frame_alloc(), jen s prictenim 0x80000000?

To mi zni rozumne (tedy, asi by se mel i nekde evidovat alokovany blok 
kvuli vma_unmap ...).

>   * Malloc je kernelovy alokator v Kalistu. Znamena to, ze pracuje jen v
>     segmentu KSEG0 nebo v celem adresovem prostoru? Pripadne jaky je
>     jeho vztah k virtualnimu adresovemu prostoru (mel by pouzivat volani
>     vma_map()?)?

Zadani se stavajici implementaci malloc nijak nevenuje (kvuli rozsahu). 
Staci, aby fungoval v blocich uvnitr KSEG0 (ale pochopitelne musite 
zajistit, ze nebude prepisovat pamet pridelenou vlaknum pomoci vma_map, 
coz jste ale v principu resili jiz ve druhem zadani).

>   * Pri vytvareni vlaken se dynamicky alokuje misto pro zasobnik, kde na
>     zacatku je explicitne misto pro ulozeni registru (pri prepinani
>     kontextu, obsluze vyjimek, ...). Znamena to, ze zasobniky vsech
>     vlaken musi byt v KSEG0 nebo vse bude fungovat (context switch,
>     vyjimky) i pokud zasobnik prestehujeme nekam do virtualniho
>     adresoveho prostoru daneho vlakna (a tedy i do jine pameti nez je
>     KSEG0)?

Pro jednoduchost je dobre nechat zasobniky vlaken v KSEG0. Zase, 
existuji i komplikovanejsi reseni, ale pokud by mel zasobnik byt v 
mapovane pameti, stavajici cpu_switch_context by musel prinejmensim ve 
spravnem okamziku nastavit novy ASID, coz ted nedela ...

>   * Obsluha vyjimek TLB invalid se udela jak? Musime pridat rozpoznani
>     konkretniho kodu vyjimky do wrapperu vseobecne vyjimky, kde jiz
>     muzeme zavolat vlastni funkci (tj. jedna se o jinou vyjimku nez TLB
>     refill a tato jiz nema svou vlastni obsluhu, ale pouziva se
>     vseobecna vyjimka)?

Jasne, rozsirit switch ve wrapped_general ... informace o vyjimce jsou v 
registrech CP0 ...

>   * Rezimy procesoru User/Supervisor/Kernel. K cemu to slouzi? Vim jak
>     zjistit v jakem rezimu se nachazim, ale podle toho co jsem nasel se
>     tyto rezimy lisi jen v tom, na ktere adresy hardware vyhodi vyjimku
>     Address Error. Je to tak?

Napriklad jeste muzete ve status registru zakazat pristup k CP0 mimo 
kernel mod ...

>   * Jsou nejake specialni pozadavky pro testy tohoto ukolu? Napriklad
>     nastavit velikost pameti RAM na nejake vetsi cislo (treba 2GB) aby
>     bylo mozno alokovat i z USEG segmentu? Pripadne podpora nesouvisle
>     pameti pres cely adresovy prostor (prochazet 4 GB adresoveho
>     prostoru a hledat jestli nekde nahodou neni volna pamet)?

Aby nedoslo k nedorozumeni, z USEG segmentu muzete alokovat i kdyz mate 
mene nez 2GB pameti (i pamet viditelna skrz KSEG0 se muze mapovat nekam 
do USEG).

Jinak v tomto zadani neni nutne potreba podporovat nesouvislou fyzickou 
pamet (to je nakonec pouze starost frame alokatoru a pokud ho zbytek 
vaseho reseni poziva, tak se jej existence nesouvislych bloku moc nedotkne).

>   * Muzete mi prosim vysvetlit tento odstavec z knihy See MIPS Run?
>       o If you make your page table start at a 4-MB boundary [jedna se o
>         KSEG2 segment] (since it's in virtual memory, any gap created
>         won't use up physical memory space) and set up the Context
>         PTEBase field with the high-order bits of the page table
>         starting the address, then, following a user refill exception,
>         the Context register will contain the address of the entry you
>         need for the refill with no further calculation needed.
>       o Jedna se o stranu 143-144, kapitola 6.5 Hardware-Friendly Page
>         Tables and Refill Mechanism, k nahlednuti na Google Knihy. Zni
>         to hrozne zajimave a chtel bych pochopit, jak neceho takoveho
>         lze dosahnout.

Tohle vysvetleni se tyka toho, jak jsou navrzena pole context registru. 
Predpoklada se, ze v okamziku vypadku v TLB budete chtit sahnout do 
strankovaci tabulky na adresu "bazova adresa tabulky + index stranky * 
velikost polozky" a odtud precist novou polozku TLB. A ten text jen 
rika, ze pokud veci vhodne umistite v pameti, registr context bude 
vlastne onu zminenou adresu rovnou obsahovat.

Tady se vlastne dotykame i vasi otazky kam umistit strankovaci tabulky. 
Tento bod naznacuje, ze evidentne prakticky zvazovane reseni je mit 
strankovaci tabulky v KSEG3, organizovat je jako jednourovnove (s tim, 
ze nevyuzite stranky strankovaci tabulky nebudou mapovane, takze vlastne 
ziskate prostorove vyhody dvouurovnoveho strankovani), na druhou stranu 
musite nejak zaridit mapovani techto tabulek v TLB.

> To je zatim asi vse. Predem dekuji za odpovedi. Protoze mam jeste techto
> hodne nejasnosti, tak vyuziji vasi nabidky a prehodim si cviceni az na
> dalsi tyden (predpokladam ze se mohu zucastnit prave jednoho).

Neni problem prijit na obe cviceni (zatim nikdy nebylo plno).

Petr Tuma




More information about the NSWI004 mailing list