7.1 任务状态段(Task State Segment)

用来管理任务的所有信息都被保存在一个特别的段中,任务状态段(TSS)。图7-1 显示了80386的TSS的格式(另一种类型用来执行80286任务,参看第13章)

TSS 状态段由两部分组成:

1、 动态部分,处理器在每次任务切换时会设置这些字段值:

  • 通用寄存器(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)。

  • 段寄存器(ES,CS,SS,DS,FS,GS)

  • 状态寄存器(EFLAGS)

  • 指令指针(EIP)

  • 前一个执行的任务的TSS段的选择子(只有当要返回时才更新)。

2、 静态字段,处理器读取,但从不更改。这些字段包括:

  • 任务的LDT选择子

  • 页目录基址寄存器(PDBR)(当启用分页时,只读)

  • 内层堆栈指针,特权级0-2

  • T-位,指示了处理器在任务切换时是否引发一个调试异常。(关于调试信息,参看第12章)

  • I/O 位图基址(关于I/O位图的信息,请参看第8章)

任务状态段可以位于线性地址的任意处。唯一一个要注意的问题是,当TSS跨了一个页的边界时,而且第二个页面又不存在时。在这种情况下,当处理器在任务切换时,读一个TSS如果发现页不存在的话,则引发一个异常。这样的异常可以通过以下两种方法来避免:

1、 把TSS只分配到一个页面中,以使它不跨越页边界。

2、 在任务切换时,保证要么两个页都在内存中,要么都不在内存中。如果两个页面都不在内存中的话,缺页中断处理程序必须在重起用于任务切换的指令前把两页都读入内存中。

7.2 TSS 描述符(TSS Descriptor)

和其它段一样,任务状态段也是用一个描述符来定义的。图7-2显示了TSS描述符的格式。

类型字段中的B-位指出任务是否忙。类型字段为9指出了一个不忙的任务。类型字段为11指出了忙的任务。任务是不可重入的。B-位可以使处理器检测到一个向忙的任务切换的操作。

BASE,LIMIT,DPL,字段和G-位、还有P-位,与其它数据段描述符的作用类似。LIMIT字段,必须大于或等于103。如果在任务切换中,发现任务描述符的界限字段小于103字节的话,处理器引发异常。更大的界限是允许的,如果I/O许可位图存在的话,更大的界限就昌必要的了。如果系统软件想要在TSS中存放额外的数据的话,更大的界限也是可能的。

一个能访问TSS描述符的子程序可以引起任务切换。在大多数系统中,TSS的DPL字段应该设置为0,所以只有最受信任的软件才能做任务切换。

有访问一个TSS的特权,并不意味着可以读或更改TSS。读和更新一个TSS段必须用另一个描述符来重定义成一个数据段。任何想要把TSS描述符加载到一个段寄存器(CS,SS,DS,ES,FS,GS)将产生异常。

TSS描述符只能位于GDT中。如果用一个选择子而且TI=1(指示在当前的LDT内)来标识一个TSS的话将产生一个异常。