发新话题
打印

请教一个进程调度的问题

请教一个进程调度的问题

最近在阅读0.11的源码,碰到一些不明白的地方,请高手多多指教:)
关于schedule()函数,这个函数的后面用到了一个switch_to()的宏,宏里有一条长跳转指令转到其他任务。
我不明白的是:这个长跳转的后面还有指令的,只有执行完这些指令schedule函数才能返回,那么long jump到其他任务后,switch_to后面的指令在什么情况下才能得到执行从而完成schedue()调用返回的?
Thanks
看不太懂,最好把部分代码写出来比较好一些~~
schedule()的函数是这样的:
void schedule()
{
/**********
找出下一任务号next
*********/
switch_to(next);
}
switch_to(n)是这样的一个宏
#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
    "je 1f\n\t" \
    "movw %%dx,%1\n\t" \
    "xchgl %%ecx,_current\n\t" \
    "ljmp %0\n\t" \                          /***从这里跳走后何时回来执行下面的指令从而完成schedule()调用?****/
    "cmpl %%ecx,_last_task_used_math\n\t" \
    "jne 1f\n\t" \
    "clts\n" \
    "1:" \
    ::"m" (*&__tmp.a),"m" (*&__tmp.b), \
    "d" (_TSS(n)),"c" ((long) task[n])); \
}
到我们的内核之旅网站,看深入分析Linux源代码第五章对调度函数的全面分析,但是,这是针对Linux2.4的:http://www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html
透析真谛,似拨云穿雾;共享智慧,如春风沐浴
http://www.kerneltravel.net
发新话题