[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