[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