idt 表中除了 中断门,陷阱门 之外,还有 任务门,任务是一个抽象的概念,他既可以是进程,也可以是线程,简言之,它指的是一系列共同达到某一目的的操作。
而在需要的时候需要通过任务门来切换任务,具体流程如下:
一、通过call指令调用任务门
任务门的结构:
其中的TYPE位置 (上边的第8~11位) 为e(h) = 0101(5)
决定了这个描述符的的类型是 任务门
二、通过任务门描述符中的TSS选择子 访问GDT 找到TSS描述符
TSS选择子结构 就是 段选择子的结构
TSS描述符结构 就是 段描述符的结构
三、通过TSS选择符的偏移找到TSS结构体
TSS结构体:
四、保存当前任务的状态,也就是将当前状态保存到当前tr寄存器指向的TSS结构体中 (tr寄存器保存的是当前TSS段选择子)
五、更新状态为新的TSS中的状态,更新内容包括通用寄存器、标志寄存器EFLAGS、段寄存器、指令指针寄存器EIP、栈指针寄存器ESP,以及局部描述符表寄存器LDTR等
六、tr寄存器指向新的任务的TSS,之后开始执行新的任务
补充:TSS描述符的DPL必须是0,所以只有CPL是0才能切换任务(还未做实验验证