[OSy] switch_cpu_context
LubomÃr Bulej
bulej at nenya.ms.mff.cuni.cz
Thu Nov 2 11:34:39 CET 2006
Dobry den,
> tak jak je to v kalistu napsane, tak mas pravdu, ze hodnota v registru
> a0 neprezije preplanovani. Myslim si, ze zrovna
> hodnota v registru a0 by preplanovani prezit mela, protoze v tomto
> registru se vzdy predava prvni argument pri volani
> nejake funkce. Takze bych rekl, ze se jedna o umyslnou chybu v kalistu,
> kterou mame napravit. Ja jsem misto
mohu vsechny ujistit, ze v kalistu umyslne chyby nejsou. Co se tyce pouziti
registru a0 ve funkci switch_cpu_context, tak jeho zniceni nevadi. Predstavte
si, jakym zpusobem dochazi k prepnuti kontextu z jednoho vlakna na druhe:
Nejprve je nutne prave bezici vlakno prerusit, coz obvykle zajisti timer
interrupt. To vyvola general exception, ktera dusledne schova vsechny registry
prave bezici ulohy (s vyjimkou k0 a k1). Obsluha general exception uz bezi v
kernelu a pokud je nutne prepnout na jiny proces, dojde k zavolani funkce
switch_cpu_context s parametry **kst1 a *kst2 v registrech a0 a a1.
Funkce switch_cpu_context ulozi aktualni kontext procesoru na zasobnik
aktualniho vlakna a obnovy kontext druheho vlakna z jeho zasobniku, vcetne
registru a0 a a1, ktere kdysi obsahovaly pointery **kst1 a *kst2, a vrati se z
funkce switch_cpu_context a tedy se neocekava, ze registry a0-a3 budou v
nejakem definovanem stavu. Tady je treba si uvedomit, ze z teto funkce se
vlakno jeste vraci zpet do kernelu (nekam do planovace) a na jeho zasobniku je
stav odpovidajici obsluze timeru v general exception handleru. Z planovace se
pak vlakno vrati do general exception handleru a pak zpet do uzivatelskeho
kontextu. Teprve pri navratu do uzivatelskeho kontextu z general exception
handleru dojde k obnoveni registru preruseneho uzivatelskeho kodu.
Takze prestoze se ve funkci switch_cpu_context schovavaji registry a0-a3, neni
to vlastne potreba.
Lubos Bulej
More information about the NSWI004
mailing list