80286的任务状态段与任务切换

调用门描述符用于系统调用 中断门描述符本质是新的中断向量表 任务状态描述符则用来在任务切换时保存任务状态

任务

任务的一个例子就是进程。任务切换的一个例子就是进程切换。 一个任务包括以下内容:

  1. 一段或几段可执行的任务代码
  2. 一段或几段任务中用得到的数据
  3. 任务在各个特权级上执行时用到的堆栈
  4. 任务的LDT,用来构成该任务私有的局部地址空间
  5. 一个任务状态段

任务状态段的格式

当一个任务被暂停执行时,CPU将该任务的某些信息存在任务状态段中。当一个原来挂起的任务被恢复执行时,CPU从该任务的任务状态段读取这些信息,恢复到任务被暂停时的状态,接着执行。存在任务状态段的信息是CPU规定并在任务切换时CPU读写的,不是一个程序员自己定义的数据结构。

任务状态段(TSS, Task State Segment)由两部分组成:

  1. 动态部分,处理器在每次任务切换时会设置这些字段值: 1.1 通用寄存器(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)。 1.2 段寄存器(ES,CS,SS,DS,FS,GS) 1.3 状态寄存器(EFLAGS) 1.4 指令指针(EIP) 1.5 前一个执行的任务的TSS段的选择子(只有当要返回时才更新)。

  2. 静态字段,处理器读取,但从不更改。这些字段包括: 2.1 任务的LDT选择子 2.2 页目录基址寄存器(PDBR)(当启用分页时,只读 当前讨论的80286并没有,到80386才有 2.3 内层堆栈指针,特权级0-2,三个特权级每个特权级一个,特权3不需要,原因是(1)当前特权级为3时,堆栈指针存在SS,SP中,(2)当前特权级不是3时,特权级3的堆栈指针被复制到当前代码的堆栈中。 2.4 T-位,指示了处理器在任务切换时是否引发一个调试异常。 2.5 I/O 位图基址,描述当前任务具有哪些IO口(in, out指令访问的那种IO口)的访问权限。

任务切换

任务切换操作将做以下的步骤:

1、 检测当前任务有权切换到指定的任务。这时数据访问规则将用于检测JMP或CALL指令。TSS描述符或者任务门的DPL字段必须小于或者等于CPL和门选择子RPL字段的最大值。中断、异常、IRET指令可以切换到任何任务,而不必管目标TSS描述符或者目标任务门的DPL字段。

2、 检测目标TSS描述符存在的,而且有一个有效的界限值。到这时,所有的错误都算是在的引发任务切换(outgoing task)的上下文中发生的。错误是可以被处理和重起的,且对于应用程序是透明的。

3、 保存当前任务的状态。处理器从任务寄存器中缓存的不可见部分来找到当前任务的基址。处理器拷贝寄存器值到当前任务TSS(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS, 和 标志寄存器EFLAG)。EIP字段则指向引起任务切换的指令的下一条指令。

4、 将新的任务的选择子加载到任务寄存器,将新任务的TSS描述符设置为忙。设置MSW的TS(task switched)标志位。选择子或是从指令操作数中得到,或是从任务门中得到。

5、 从新的任务的TSS中加载任务的状态,并恢复其执行。加载的寄存器是LDT寄存器,标志寄存器(EFLAG)通用寄存器EIP,EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI;段寄存器ES,CS,SS,DS,FS,和GS。还有PDBR(CR3)。所有检测到的错误将发生在新任务的上下文中。对于一个异常处理程序,看来起好似新任务的第一条指令还未执行。

注意,不管怎么样,旧任务的状态总是会被保存。如果这个任务被重新执行,它执行引起任务切换的指令的后一条指令。当任务执行时,所有寄存器的值将被恢复。

每一次任务切换都会设置MSW(machine status word)的TS(task switched)位。TS标志对于有协处理器的系统来说是很重要的。TS位指出了协处理器的状态可能和当前任务的状态不一致了。第11章进一步讨论TS位。

处理任务切换异常的处理程序(表7-1中由第4到16引起的异常)应该注意加载引起异常的选择子的操作。这样的操作可能引发第二次异常,除非异常处理程序首先检查了选择子并修定了潜在的问题。

将要执行的任务的特权级即不被引起任务切换的任务所影响,也不会被它所约束。因为每个任务的地址空间是分开的,且有不同的TSS,还有就是特权级规则可以用于防止不合法的TSS访问,但是没有哪种特权级规则需要用来去约束不同任务间的CPL。新的任务将在CS选择子的RPL字段特权级执行,这个CS是由TSS中加载的。

直接任务切换和间接任务切换

任务的切换有几种方式: 1、 直接切换,当前任务执行了一个JMP或CALL,而操作数中指定了一个TSS描述符。 2、 间接切换,当前任务执行了一个JMP或CALL,而操作数中指定了一个任务门。 3、 一个在IDT中的中断向量或异常向量导致向一个新的任务切换。 4、 当前任务执行了一条IRET指令,而且NT位设置时。

抛开中断相关的内容,任务切换有两种方式,直接方式(通过任务状态段)和间接方式(通过任务门、任务门再指向任务状态段)。 通过任务状态段切换任务的流程图如下:

通过任务门切换任务的流程图如下:

一个任务门描述符提供了一个间接的、有保护性的对一个TSS的的访问方法。

任务门描述符和任务状态段描述符的格式

一个任务状态段(TSS)由一个任务状态段描述符(TSS描述符)来描述。TSS描述符的结构如下:

一个任务门描述符的格式如下: