#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
"je 1f\n\t" \
"xchgl %%ecx,_current\n\t" \
"movw %%dx,%1\n\t" \
"ljmp %0\n\t" \
"cmpl %%ecx,%2\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"m" (last_task_used_math),"d" _TSS(n),"c" ((long) task[n])); \
}
这部分代码有些疑问,虽然不至于完全不懂,但是有部分问题需要认真解决。
__tmp的作用大概已经知道,但是需要证实,last_task_used_math的真正功能需要去读更多的源代码。为什么后面使用clts来清CR0的TS位,需要认真看Intel的技术手册的TSS和task switch相关部分。