IA32处理器任务切换
以下4中情况会使处理器跳转到其它任务:
(1)当前的程序或任务执行JMP或CALL指令指向GDT中TSS描述符。
(2)当前的程序或任务执行JMP或CALL指令指向GDT或当前LDT中的任务门描述符。
(3)一个中断或异常指向IDT中的任务门描述符。
(4)当EFLAGS寄存器中NT标志置位时,当前任务执行IRET指令。
当切换到新任务时,处理器完成以下操作:
(1)从任务门或先前的任务链接字段中获得新任务的TSS段选择符作为指令JMP或CALL的操作数。
(2)检查当前任务是否允许切换到新任务。当前任务的CPL和针对新任务的选择符的RPL必须小于等于引用的TSS描述符或任务门的DPL。异常、中断和IRET指令允许不管目的任务门或TSS描述符的DPL,切换任务。如果INT n指令产生的中断,需要检查DPL。
(3)检查新任务TSS描述符标记为存在和有有效的界限。
(4)检查新任务是否可用(调用、跳转、异常或中断)或者忙(IRET返回)。
(5)检查当前的TSS,新TSS 和所有任务切换用到的段描述符是否在内存页表中。
(6)如果JMP和IRET指令发起的任务切换,处理器在当前任务TSS描述符中清除B忙位;如果CALL指令、异常或中断发起的,B位保留设置。
(7)如果IRET指令发起的任务切换,处理器暂时清除保存在EFLAGS寄存器的NT标志;如果CALL指令、异常或中断发起的,在保存的EFLAGS寄存器内容中,NT标志不变。
(8)在当前任务的TSS保存当前任务的状态信息。
(9)如果CALL指令、异常、中断发起的任务切换,处理器从新任务中加载EFLAGS并设置NT标志。如果IRET指令或JMP指令发起,从新任务中加载的EFLAGS寄存器中的NT标志反映NT的状态。
(10)如果CALL指令、JMP指令、异常或中断发起任务切换,处理器在新任务的TSS描述符中设置B忙位;如果IRET指令发起,B位保留。
(11)加载新任务的段选择符和TSS描述符。
(12)处理器加载TSS状态。包括LDTR,PDBR(CR3),EFLAGS,EIP,通用寄存器等。
(13)加载和段选择符相关的描述符并确认。
(14)开始执行新任务。
good luck!