转自:http://blog.sina.com.cn/s/blog_626aed8b0100idnx.html
注:. 用JMP或CALL指令直接访问新任务的任务状态段
例如: JMP(或CALL) 偏移量 选择符 (在linux 中 ljmp $SS1SEL,$0)
不用指令中的选择符即为新任务的任务状态段的选择符,把此选择符加载TR就形成任务切换(当然要经过合法性保护检查)。其切换过程可以概括为下列步骤:
(1) 将离去任务的状态存放在离去任务的TSS中。任务状态包括离去任务所使用的所有寄存器:8个32位通用寄存器,6个段寄存器和EFLAGS等。此时应该将EIP指向 跳转语句的下一条语句,并将其保存至TSS结构中。
(2) GDTR中的基地址加上指令中选择器的索引×8来选择新任务的TSS描述符。
(3) 新任务的TSS描述符指向了新任务的TSS。对于任务嵌套任务,TR的选择器部分被存入新的TSS的“后备连接TSS选择器”字中。
(4)TR寄存器 由指令中的选择器和新任务的TSS描述符装载。
(5)新TSS中的LDT选择器的索引×8加上GDTR中的基地址来选择新任务的LDT描述符。
(6)根据新任务的LDT描述符和新TSS中的LDT选择器来装载LDTR寄存器。
(7)EIP和CS选择器分别存入EIP和CS寄存器。
(8)新TSS中的CS选择器的索引×8和GDTR的基地址或刚刚装载了新内容的LDTR中的基地址相加被用来从GDT或新的LDT中选择一个代码段描述符。
(9)这个代码段描述符被存入CS缓冲器。
(10)CS缓冲器的基地址与EIP相加产生程序的入口地址,然后启用新TSS的内容来填充新任务的各寄存器。
(11)执行新的任务。