[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