[OSy] chyba v kalistu -- sys.S, 509, 510 ?
Martin Decky
decky at dsrg.mff.cuni.cz
Tue Oct 23 17:39:41 CEST 2007
> To je pravda. Ale mne ho do registru natahuje RESTORE_GENERAL_REGS $sp
> ze zasobniku daneho vlakna a pak se teprve provadi prvni volani
> (mluvim ted o uplne prvnim prepnuti na dane vlakno) pomoci jumpu.
>
> Mezitim se tedy provadi ona operace prepsani registru a0 -- proc?
Ale pochopte, ze ta funkce switch_cpu_context() se musi symetricky
parovat s jinym volanim switch_cpu_context(). V kontextu A se zavola
switch_cpu_context(), ktery prepne na kontext B. Nekdy pozdeji se zase
odnekud zavola switch_cpu_context(), cimz se prepne zpet na kontext A,
ale pro ten to bude vypadat jako standardni navrat z funkce
switch_cpu_context().
Analogicky pro pohled z kontextu B. Kdyz se obnovi kontext B, vypada to,
jako by se vratil z volani funkce switch_cpu_context(). Zkuste si to
poradne nakreslit, at to pochopite. Chapu, ze kdyz je clovek zvykly na
klasicke sekvencni programovani v cecku, tak z toho muze byt ponekud zmaten.
context A context B
|
|
|
switch_cpu_context() ---> (return)
|
|
|
(return) <---- switch_cpu_context()
|
|
|
Volaci konvence pro MIPS proste rika, ze registry a0 - a3 se
nezachovavaji behem volani funkce. Proto muze switch_cpu_context() obsah
registru a0 znicit -- je to funkce (i kdyz se return dela do jineho
kontextu nez entry).
Pokud potrebujete _nove_vytvarenemu_kontextu_ neco predat do registru,
vytvorte si jinou "nesymetrickou" funkci (napr. load_context()), ktera
bude mit jinou semantiku.
M.D.
More information about the NSWI004
mailing list