[OSy] context switch

Vlastimil Babka babka at d3s.mff.cuni.cz
Sun Nov 7 21:04:13 CET 2010


On 11/07/2010 08:09 PM, Michal Klempa wrote:
> Zdravim,
Dobry vecer,
> mozno sa spytam teraz uplne mimo, ale predsalen. Nejde mi do hlavy toto:
> thread.c (original kalisto):
> 105    if (old_thread == NULL) {
> 106      void *dummy_stack_top;
> 107      switch_cpu_context(&dummy_stack_top,&thread->stack_top);
> 108    } else
> 109      switch_cpu_context(&old_thread->stack_top,&thread->stack_top);
>
> Assemblerovska funkcia switch_cpu_context ulozi vsetky registre na
> stack_top ktory jej poslem ako parameter, ze jo?
Tak to neni. Ta funkce ulozi registry na aktualni stack (tzn kam ukazuje 
registr $sp) a vysledne $sp ulozi na adresu stack_top.
Puvodni obsah toho pointeru se nijak nepouziva. (viz komentar ke 
switch_cpu_context v head.S).
> Kam ukazuje dummy_stack_top a kam sa teda ulozia registre ked prepinam
> na nejake vlakno prvy krat? (teda ked sa dokonci ta init cast v main.c
> a spravi sa prve switch_to_thread na example thread).
Viz vyse. Kam ukazuje dummy_stack_top neni podstatne, obsah toho 
pointeru se pouze prepise. Registry se ulozi na stack (pri startu je to 
tusim kernel static stack na pevne adrese), samotny pointer 
dummy_stack_top bude na tom stacku taky, hned pred nimi. Tento obsah 
zasobniku se uz ale nikdy nepouzije (k preplanovani zpet do tohoto 
kontextu uz nikdy nedojde), a tedy muze byt klidne v budoucnu prepsan 
(static stack pouzivaji i exception handlery). Ten dummy_stack_top je 
tam tedy od toho, aby switch_cpu_context nemusela resit rozdil mezi 
prvnim prepnutim a dalsimi prepnutimi.

Vlastimil Babka
> D~
> Michal Klempa
>
> _______________________________________________
> OSy mailing list
> OSy at d3s.mff.cuni.cz
> https://d3s.mff.cuni.cz/mailman/listinfo/osy





More information about the NSWI004 mailing list