TR and tss

任务寄存器tr保存 16 位的段选择子、32 位基地址、16 位段界限和当前任务的 TSS属性。它引用 GDT 中的 TSS 描述符。基地址指明 TSS 的第一个字节(字节 0)的线性地址,段界限确定 TSS 的字节个数。TR寄存器包含了当前正在CPU运行的进程的TSSD(任务段描述符)选择符。也包含了两个隐藏的非编程域:TSSD的base 和limit域。通过这种方式处理器就能直接对TSS寻址,而不用从GDT中索引TSS的地址

TR寄存器---->GDT中的TSS描述符---->硬件上下文的具体数据。任务切换中


cpu会把当前寄存器的数据保存到当前(旧的)tr寄存器所指向的tss数据结构里,然后把新的tss数据复制到当前寄存器里。这些操作是通过cpu的硬件实现的


任务状态段(Task State Segment)是保存一个任务重要信息的特殊段。任务状态段描述符用于描述这样的系统段。任务状态段寄存器TR的可见部分含有当前任务的任务状态段描述符的选择子,TR的不可见的高速缓冲寄存器部分含有当前任务状态段的段基地址和段界限等信息。

  TSS在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到TR所指定的TSS中;然后,下一任务的TSS的选择子被装入TR;最后,从TR所指定的TSS中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在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确定。显然,随着任务的切换,地址映射关系也要切换。
  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,那么在任务切换完成之后,新任务的第一条指令执行之前产生调试陷阱。

6.用结构类型定义TSS

  根据上图给出的任务状态段TSS的结构,可定义如下的TSS结构类型:
;----------------------------------------------------------------------------
;任务状态段结构类型定义
;----------------------------------------------------------------------------
TSS             STRUC

TRLink          DW      0      ;链接字段
                DW      0      ;不使用,置为0
TRESP0          DD      0      ;0级堆栈指针

TRSS0           DW      0      ;0级堆栈段寄存器
                DW      0      ;不使用,置为0
TRESP1          DD      0      ;1级堆栈指针

TRSS1           DW      0      ;1级堆栈段寄存器
                DW      0      ;不使用,置为0
TRESP2          DD      0      ;2级堆栈指针

TRSS2           DW      0      ;2级堆栈段寄存器
                DW      0      ;不使用,置为0
TRCR3           DD      0      ;CR3

TREIP           DD      0      ;EIP
TREFlag         DD      0      ;EFLAGS
TREAX           DD      0      ;EAX

TRECX           DD      0      ;ECX
TREDX           DD      0      ;EDX
TREBX           DD      0      ;EBX

TRESP           DD      0      ;ESP
TREBP           DD      0      ;EBP
TRESI           DD      0      ;ESI

TREDI           DD      0      ;EDI
TRES            DW      0      ;ES
                DW      0      ;不使用,置为0

TRCS            DW      0      ;CS
                DW      0      ;不使用,置为0
TRSS            DW      0      ;SS

                DW      0      ;不使用,置为0
TRDS            DW      0      ;DS
                DW      0      ;不使用,置为0

TRFS            DW      0      ;FS
                DW      0      ;不使用,置为0
TRGS            DW      0      ;GS

                DW      0      ;不使用,置为0
TRLDTR          DW      0      ;LDTR
                DW      0      ;不使用,置为0
TRTrip          DW      0      ;调试陷阱标志(只用位0)
TRIOMap         DW      $ 2    ;指向I/O许可位图区的段内偏移
TSS             ENDS

### TSS 技术内容概述 TSS(Task State Segment,任务状态段)是 x86 架构中用于支持任务切换的一种数据结构。它主要用于存储任务的上下文信息,包括寄存器状态、堆栈指针、I/O 权限等。TSS 在任务切换过程中起到关键作用,使得处理器能够保存当前任务的状态并恢复新任务的状态。 #### TSS 的结构与寄存器 TSS 是一个特殊的段,其结构由操作系统定义,通常包含以下内容: - **通用寄存器**:如 EAX、EBX、ECX、EDX 等。 - **段寄存器**:CS、DS、SS、ES、FS、GS。 - **指令指针寄存器**:EIP。 - **标志寄存器**:EFLAGS。 - **堆栈指针**:ESP 和 SS。 - **链接字段**:用于任务链的链接指针。 - **I/O 权限位图**:控制对 I/O 端口的访问权限。 TSS 由任务寄存器TR指向TR 保存了当前任务的 TSS 描述符选择子,并包含了一些隐藏的非编程字段,如 TSS 的基地址和段界限。通过 TR,处理器可以直接访问 TSS,而无需从 GDT(全局描述符表)中查找 TSS 的地址 [^1]。 #### TSS 在任务切换中的作用 在 x86 架构中,任务切换可以通过 `JMP` 或 `CALL` 指令跳转到另一个任务的 TSS 描述符来实现。当执行任务切换时,处理器会自动保存当前任务的上下文到当前 TSS 中,并从目标 TSS 中加载新任务的上下文。这种方式虽然提供了硬件级别的任务切换机制,但其性能并不理想。例如,`ljmp` 指令实现任务切换大约需要 200 多个时钟周期 [^2]。 由于硬件任务切换的开销较高,现代操作系统如 Linux 和 Windows 并未采用 TSS 进行任务切换,而是通过软件方式使用堆栈来实现上下文切换。这种方式不仅提高了性能,还允许利用指令流水线的并行优化技术,简化了 CPU 的设计 [^2]。 #### TSS 在操作系统中的应用 尽管现代操作系统不使用 TSS 进行任务切换,TSS 仍然在某些场景中发挥作用。例如,在 Linux 中,TSS 被用来处理中断和异常,确保在进入特权级切换时能够正确加载内核堆栈指针(ESP0)。每个 CPU 核心都有一个对应的 TSS,用于保存中断处理时使用的堆栈信息。 以下是一个简化的 Linux TSS 初始化示例: ```c struct tss_struct { unsigned short back_link, __blh; unsigned long esp0; unsigned short ss0, __ss0h; unsigned long esp1; unsigned short ss1, __ss1h; unsigned long esp2; unsigned short ss2, __ss2h; unsigned long cr3; unsigned long eip; unsigned long eflags; unsigned long eax, ecx, edx, ebx; unsigned long esp, ebp, esi, edi; unsigned short es, __esh; unsigned short cs, __csh; unsigned short ss, __ssh; unsigned short ds, __dsh; unsigned short fs, __fsh; unsigned short gs, __gsh; unsigned short ldt, __ldth; unsigned long t; unsigned long iomb; } __attribute__((packed)); // 初始化 TSS void init_tss(struct tss_struct *tss, unsigned long esp0) { memset(tss, 0, sizeof(*tss)); tss->ss0 = KERNEL_DS; // 设置内核数据段 tss->esp0 = esp0; // 设置内核堆栈指针 tss->eflags = 0x202; // 设置默认的 EFLAGS 值 } ``` #### TSS 在其他领域的应用 除了在操作系统中的任务切换和中断处理中使用外,TSS 还可以出现在其他技术领域。例如,在海缆探测中,TSS350 是一种用于测量海缆埋深的设备。它通过剖面声呐扫描基准海床面,并结合软件处理和人工过滤,提供精确的埋深数据。然而,这种数据处理过程较为耗时,例如对 6km 海缆、每米一个测点的情况,大约需要 12 小时进行数据处理 [^3]。 ### TSS 的优缺点 **优点:** - 提供了硬件级别的任务切换机制。 - 可用于中断处理和特权级切换。 - 简化了上下文保存和恢复的操作。 **缺点:** - 硬件任务切换性能较低,开销较大。 - 不支持现代多核处理器的复杂调度需求。 - 实现复杂,调试困难。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值