switch_to的代码在linux-0.11\include\linux中的sched.h。它是一个宏定义,代码如下:
#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" \
"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])); \
}
首先讲一下末尾的
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"d"(_TSS(n)),"c" ((long) task[n])); \
这句话吧,假如看过嵌入式汇编的应该知道这个内容,不过我还是多写点也帮助自己记忆。第一个冒号表示输出寄存器为空,第二个冒号表示输入寄存器,其中*&__tmp.a和*&__tmp.b存在任意寄存器中,m就代表任意寄存器,_TSS(n)即该任务在GDT中的选择符,对于这个的理解需要明白GDT的构成&