Chinaunix首页 | 论坛 | 博客
  • 博客访问: 292739
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友

分类: LINUX

2010-12-10 21:58:39

TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息。   

      X86体系从硬件上支持任务间的切换。为此目的,它增设了一个新段:任务状态段(TSS),它和数据段、代码段一样也是一种段,记录了任务的状态信息。  

      与其它段一样,TSS也有描述它的结构:TSS描述符表,它记录了一个TSS的信息,同时还有一个TR寄存器,它指向当前任务的TSS。任务切换的时候,CPU会将原寄存器的内容写出到相应的TSS,同时将新TSS的内容填到寄存器中,这样就实现了任务的切换。

      TSS在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。所谓任务切换是指挂起当前正在执行的任务,恢复或启动执行另一个任务。Linux任务切换是通过switch_to这个宏来实现的,它利用长跳指令,当长跳指令的操作数是TSS描述符的时候,就会引起CPU的任务的切换,此时,CPU将所有寄存器的状态保存到当前任务寄存器TR所指向的TSS段中,然后利用长跳指令的操作数(TSS描述符)找到新任务的TSS段,并将其中的内容填写到各个寄存器中,最后,将新任务的TSS选择符更新到TR中。这样系统就开始运行新切换的任务了。由此可见,通过在TSS中保存任务现场各寄存器状态的完整映象,实现了任务的切换。 task_struct中的tss成员就是记录TSS段内容的。当进程被切换前,该进程用tss_struct保存处理器的所有寄存器的当前值。当进程重新执行时,CPU利用tss恢复寄存器状态。


在任务切换过程中,

首先,处理器中各寄存器的当前值被自动地保存到TR所指定的TSS中;
然后,下一任务的TSS的选择子被装入TR;
最后从TR所指定的TSS中取出各寄存器状态的完整映象,实现任务的切换.
任务状态段TSS - glasses0-0 - glasses0-0 的博客
1.链接字段
   链接字段安排在TSS内偏移0开始的双字中,其高16位未使用.在起链接作用时,低16位保存前一任务的TSS描述符的选择子
   -------------------
   如果当前的任务由段间调用指令CALL或者中断/异常而激活,那么链接字段保存被挂起的TSS的选择子,
   并且标志寄存器EFLAG中的NT位被置1,使链接字段有效.
   在返回时,由于NT位1,中断返回指令IRET将使得控制沿着链接字段所指恢复到链上的前一个任务.

2.内层堆栈指针区域
   为了有效地实现保护,一个任务在不同的特权级下使用不同的堆栈.
   TSS的内层堆栈指针区域中有三个堆栈指针,都是48位的全指针(16位的选择子,32位的偏移),
   分别指向0级、1级、2级堆栈的栈顶,依次存放在TSS中的偏移为4,12和20.
   -----------------
   当发生向内层转移时,则把适当的堆栈指针装入到SS及ESP寄存,以变换内层的堆栈,外层堆栈的指针保存在内层堆栈中.
   当特权级由内层向外层变换时,并不把内层堆栈的指针保存到TSS的内层堆栈指针区域.
   向内层转移时,总是把内层堆栈认为是一个空栈,因此,不允许发生同级内层转移的递归.
   一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回.

3.地址映射寄存器区域
   与特定任务相关的虚拟地址空间到物理地址空间的映射由LDTR和CR3确定
   TSS的地址映射寄存器区域由位于偏移1CH处的双字字段(CR3)和位于偏移60H处的字字段(LDT)组成.
   在任务切换时,处理器自动从轮到执行的任务的TSS中取出这两个字段,分别装入到寄存器CR3和寄存器LDTR
   但处理器并不把换出任务当时的寄存器CR3和LDTR的内容保存到TSS中的地址映射寄存器区域.
   所以,如果程序改变了LDTR或CR3,那么必须把新值保存TSS中的地址映射寄存器区域相应字段中.

4.寄存器保存区域
   寄存器保存区域位于TSS内偏移20H至5FH处,用于保存通用寄存器、段寄存器、指令指针和标志寄存器.
   在当前任务被切换出时,当前寄存器的值就保存在该区域.
   在下次切换回原任务时,再从保存区域恢复.

5.其它字段.
   在TSS内偏移66H处的字用于存放I/0许可位图在TSS内的开始偏移.
   ----------
   在TSS内偏移64H处的字是为任务提供的特别属性,
   该字最低位为T,其它位为0;如果进入任务的T位为1,任务切换完成之后,新任务的第一条指令执行之前产生调试陷阱.

=========TSS的结构定义=================
任务状态段TSS - glasses0-0 - glasses0-0 的博客
任务状态段TSS - glasses0-0 - glasses0-0 的博客


阅读(869) | 评论(0) | 转发(0) |
0

上一篇:描述符

下一篇:LINUX系统调用

给主人留下些什么吧!~~