分享

TSS任务状态段

 tuohuang0303 2012-04-01
 
1 什么是TSS 
TSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程)切换时的任务现场信息。 

任务状态段TSS的结构
 

TSS段的最小长度为104字节,低104字节依照下列格式存放数据。

在这104字节以外还可以存放I/O许可位图以及其他信息,相应增加TSS段长度。

31....16

15...0

段内偏移值

I/O位图基地址

T

0x64

LDT段选择符

0x60

GS

0x5c

FS

0x58

DS

0x54

SS

0x50

CS

0x4C

ES

0x48

EDI

0x44

ESI

0x40

EBP

0x3C

ESP

0x38

EBX

0x34

EDX

0x30

ECX

0x2C

EAX

0x28

EFLAGS

0x24

EIP

0x20

页目录基地址寄存器CR3PDBR

0x1C

SS2

0x18

ESP2

0x14

SS1

0x10

ESP1

0x0C

SS0

0x08

ESP0

0x04

前任务链接(TSS选择子)

0x00

静态字段(通常不会被改变,任务创建时设置):

(1) I/O位图基地址字段:I/O许可位图相对TSS开始处的16位偏移值;(I/O许可位图基址大于或等于TSS段界限,表示没有I/O许可位图。CPL<=IOPL,所有I/O指令都会引起异常。I/O许可位图使同一特权级下的不同任务可以有不同的I/O访问权限)
(2) T
调试陷阱(Debug Trap)标志字段:T1 处理器切换到该任务的操作将产生一个调试异常;

(3) 页目录基址寄存器(Page directory base registerPDBRCR3:含有任务使用的页目录物理基地址;
(4) SS0 SS1 SS2 ESP0 ESP1 ESP2
:分别为特权级012的堆栈选择符(SS0SS1SS2)和栈中偏移指针(ESP0 ESP1 ESP2),对于一个指定的任务,这些字段的值是不变的(?Why?);

(5) LDT段选择符字段:任务的LDT段的选择符。

动态字段(任务切换时,处理更新的字段):

(1) 段选择符字段:段寄存器的值;
(2)
通用寄存器:通用寄存器的值;
(3)
标志寄存器字段:EFLAGS的值;
(4)
指令指针EIP字段:EIP寄存器的值;
(5)
前任务链接字段:前一个任务的TSS段选择符,允许任务使用IRET切换到前一个任务。

附:

(1) I/O许可位图(I/O Permission Bitmap):
I/O
许可位图中的第i位=0 端口iH可用,I/O许可位图中的第i位=1 端口iH不可用;
I/O
许可位图必须以0ffH结尾
(2) IOPL
I/O特权级(I/O Privilege Level),标志寄存器EFLAGS1312位,当前运行任务的I/O特权级,(当前运行任务的CPL必须小于或等于IOPL才能访问I/O地址空间,CPL0,程序才可以使用POPFIRET指令修改这个字段.)(EFLAGS链接


2 TSS工作细节
TSS在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到TR(任务寄存器)所指定的TSS中;然后,下一任务的TSS的选择子被装入TR;最后,从TR所指定的TSS中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在TSS中保存任务现场各寄存器状态的完整映象,实现任务的切换。
3 TSS的格式 任务状态段TSS的基本格式如下图所示。 TSS的基本格式由104字节组成。这104字节的基本格式是不可改变的,但在此之外系统软件还可定义若干附加信息。基本的104字节可分为链接字段区域、内层堆栈指针区域、地址映射寄存器区域、寄存器保存区域和其它字段等五个区域。
(1). 寄存器保存区域 寄存器保存区域位于TSS内偏移20H至5FH处,用于保存通用寄存器、段寄存器、指令指针和标志寄存器。当TSS对应的任务正在执行时,保存区域是未定义的;在当前任务被切换出时,这些寄存器的当前值就保存在该区域。当下次切换回原任务时,再从保存区域恢复出这些寄存器的值,从而,使处理器恢复成该任务换出前的状态,最终使任务能够恢复执行。 从上图可见,各通用寄存器对应一个32位的双字,指令指针和标志寄存器各对应一个32位的双字;各段寄存器也对应一个32位的双字,段寄存器中的选择子只有16位,安排再双字的低16位,高16位未用,一般应填为0。
(2). 内层堆栈指针区域 为了有效地实现保护,同一个任务在不同的特权级下使用不同的堆栈。例如,当从外层特权级3变换到内层特权级0时,任务使用的堆栈也同时从3级变换到0级堆栈;当从内层特权级0变换到外层特权级3时,任务使用的堆栈也同时从0级堆栈变换到3级堆栈。所以,一个任务可能具有四个堆栈,对应四个特权级。四个堆栈需要四个堆栈指针。 TSS的内层堆栈指针区域中有三个堆栈指针,它们都是48位的全指针(16位的选择子和32位的偏移),分别指向0级、1级和2级堆栈的栈顶,依次存放在TSS中偏移为4、12及20开始的位置。当发生向内层转移时,把适当的堆栈指针装入SS及ESP寄存器以变换到内层堆栈,外层堆栈的指针保存在内层堆栈中。没有指向3级堆栈的指针,因为3级是最外层,所以任何一个向内层的转移都不可能转移到3级。 但是,当特权级由内层向外层变换时,并不把内层堆栈的指针保存到TSS的内层堆栈指针区域。实际上,处理器从不向该区域进行写入,除非程序设计者认为改变该区域的值。这表明向内层转移时,总是把内层堆栈认为是一个空栈。因此,不允许发生同级内层转移的递归,一旦发生向某级内层的转移,那么返回到外层的正常途径是相匹配的向外层返回。
(3). 地址映射寄存器区域 从虚拟地址空间到线性地址空间的映射由GDT和LDT确定,与特定任务相关的部分由LDT确定,而LDT又由LDTR确定。如果采用分页机制,那么由线性地址空间到物理地址空间的映射由包含页目录表起始物理地址的控制寄存器CR3确定。所以,与特定任务相关的虚拟地址空间到物理地址空间的映射由LDTR和CR3确定。显然,随着任务的切换,地址映射关系也要切换。 [Page] TSS的地址映射寄存器区域由位于偏移1CH处的双字字段(CR3)和位于偏移60H处的字字段(LDTR)组成。在任务切换时,处理器自动从要执行任务的TSS中取出这两个字段,分别装入到寄存器CR3和LDTR。这样就改变了虚拟地址空间到物理地址空间的映射。 但是,在任务切换时,处理器并不把换出任务但是的寄存器CR3和LDTR的内容保存到TSS中的地址映射寄存器区域。事实上,处理器也从来不向该区域自动写入。因此,如果程序改变了LDTR或CR3,那么必须把新值人为地保存到TSS中的地址映射寄存器区域相应字段中。可以通过别名技术实现此功能。
(4). 链接字段 链接字段安排在TSS内偏移0开始的双字中,其高16位未用。在起链接作用时,地16位保存前一任务的TSS描述符的选择子。 如果当前的任务由段间调用指令CALL或中断/异常而激活,那么链接字段保存被挂起任务的 TSS的选择子,并且标志寄存器EFLAGS中的NT位被置1,使链接字段有效。在返回时,由于NT标志位为1,返回指令RET或中断返回指令IRET将使得控制沿链接字段所指恢复到链上的前一个任务。
(5). 其它字段 为了实现输入/输出保护,要使用I/O许可位图。任务使用的I/O许可位图也存放在TSS中,作为TSS的扩展部分。在TSS内偏移66H处的字用于存放I/O许可位图在TSS内的偏移(从TSS开头开始计算)。关于I/O许可位图的作用,以后的文章中将会详细介绍。 在TSS内偏移64H处的字是为任务提供的特别属性。在80386中,只定义了一种属性,即调试陷阱。该属性是字的最低位,用T表示。该字的其它位置被保留,必须被置为0。在发生任务切换时,如果进入任务的T位为1,那么在任务切换完成之后,新任务的第一条指令执行之前产生调试陷阱。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多