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的构成,我截了linux内核完全注释中的一张图,如下

本文详细解析了Linux 0.11内核中的switch_to()宏定义,涉及GDT、TSS、任务切换等概念。通过分析_TSS(n)宏和ljmp指令,阐述了任务切换的硬件原理和操作时机,包括JMP、CALL、中断、异常和IRET指令。最后介绍了切换后如何处理协处理器的状态。
最低0.47元/天 解锁文章
2742

被折叠的 条评论
为什么被折叠?



