`
izuoyan
  • 浏览: 9224378 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

TSS 段(任务状态段)

 
阅读更多

TSS在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到TR所指定的TSS中;然后,下一任务的TSS的选择子被装入TR;最后,从TR所指定的TSS中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在TSS中保存任务现场各寄存器状态的完整映象,实现任务的切换。(TR 当前任务状态寄存器)

任务状态段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,那么在任务切换完成之后,新任务的第一条指令执行之前产生调试陷阱。

分享到:
评论

相关推荐

    TSS.zip_tss

    标题中的"TSS.zip_tss"指的是一个以TSS命名的ZIP压缩文件,它包含了与TSS(可能是“时间序列分割”或“跟踪状态选择”等技术的缩写)相关的MATLAB源代码。MATLAB是一种广泛用于数值计算、数据分析和算法开发的高级...

    TSS_java_

    【标题】"TSS_java_" 指的是一款基于Java编程语言实现的贪食蛇游戏。在计算机科学和编程领域,贪食蛇游戏是一个经典的示例,它展示了基础的图形用户界面(GUI)编程、事件处理和游戏逻辑设计。这款Java版的贪食蛇...

    80386保护模式下的主要概念 80386保护模式下的主要概念

    - 系统段:包括任务状态段(TSS)和局部描述符表(LDT)段,用于实现更高级的存储管理。TSS保存任务状态信息,而LDT则是一张表,存储局部描述符。 2. **段描述符** - 段描述符是80386保护模式下描述段的关键数据...

    GCC与汇编保护模式编程实例三

    在保护模式下,每个任务都有自己的任务状态段(Task State Segment, TSS)和局部描述符表(Local Descriptor Table, LDT)。TSS保存了任务切换时所需的状态信息,如寄存器值,而LDT则包含任务私有的段描述符,这些...

    操作系统中任务调度的实现

    TSS是用于保存任务状态信息的一个区域,它的结构如下: - **ESP0/SS0**:用于保存零特权级的ESP和SS值。 - **ESP1/SS1**:用于保存第一特权级的ESP和SS值。 - **ESP2/SS2**:用于保存第二特权级的ESP和SS值。 - **...

    进程管理_80386基础.doc

    系统段中包括任务状态段(TSS)和局部描述符表(LDT)段。其中,TSS用于存储任务状态信息,LDT则用于存放局部描述符表。 #### 1.2 段描述符 段描述符是一个重要的数据结构,用于描述段的属性,如基地址、限长和特权级...

    GDT.rar_Table_gdt

    GDT是一个数据结构,包含了多个描述符,每个描述符都定义了一个内存段或一个任务状态段(Task State Segment, TSS)。这些描述符提供了访问权限、地址空间和段属性等信息。在32位的x86系统中,每个描述符由8个字节...

    Window s 中段页式内存管理硬件实现剖析

    段页式内存管理方式下的寻址过程中,操作系统为某任务建立了任务状态段(TSS)并将当前使用的程序段调入内存时,可以执行该任务。代码段寄存器(CS:EIP)的赋值不能由用户在程序中实现,而是由操作系统给定初值;...

    linux内核笔记——进程管理_80386基础

    - **系统段**:一种特殊类型的段,用于实现存储管理机制,包括任务状态段(TSS)和局部描述符表(LDT)段。 #### 4. 段描述符 段描述符是8字节大小的数据结构,用于描述一个段的所有属性。它可以分为两种类型: 1. **...

    80386保护模式下的主要概念

    - **任务状态段 (TSS)**:用于存储任务的状态信息,如处理器的寄存器值、中断屏蔽标志等。 - **局部描述符表 (LDT)**:包含局部描述符表,该表中记录了特定任务相关的段描述符。 #### 三、段描述符 **定义**: - ...

    Linux进程总结草稿[定义].pdf

    为了支持进程切换,引入了任务状态段(TSS)。每个进程都有一个固定大小的TSS,保存了进程被挂起时的寄存器值和其他重要信息。TSS在GDT中占用一个表项,内容包括各寄存器的值、I/O映射基地址等。 在进程切换时,CPU...

    1140320206_霍峻杰1

    GDT包含8个描述符,用于定义不同的段,如内核代码段、内核数据段、显示内存段以及任务状态段(TSS)和局部描述符表(LDT)。之后,`head.s`会配置8253定时芯片,设置中断周期为10ms,频率为100Hz。 2. **内存分布...

    保护模式下的80386及其编程

    这涉及到任务状态段(TSS)的使用,TSS保存了任务的上下文信息。 五、中断和异常处理 80386的中断和异常处理在保护模式下更为复杂,中断描述符表(IDT)包含了所有中断和异常处理程序的入口。每个中断或异常处理程序都...

    linux完全注释中 x86架构任务切换实验的汇编完全注释

    此外,x86架构的保护模式提供了任务隔离的机制,通过任务状态段(TSS)和分页机制确保了不同任务之间的数据安全。在任务切换时,这些机制必须正确地配置和操作,以防止数据泄露或冲突。 通过深入学习这个实验,你...

    重庆理工大学操作系统基于Linux0.11内核的实践

    基于内核栈切换的进程切换实验,使用基于内核栈的进程切换成功替换基于TSS(任务状态段)的切换。 地址映射与贡献实验,成功部分为通过寻找物理地址直接修改物理地址的参数,促使循环结束;实现了基于内存共享的生产者...

    保护模式下的80386及编程

    6. **任务切换**:80386支持多任务,通过任务状态段(TSS)进行任务切换。每个任务都有自己的寄存器状态,切换任务时,处理器会保存当前任务的状态,然后加载新任务的状态,实现任务之间的平滑切换。 7. **内存保护...

    x86保护模式的介绍

    9. **任务状态段(TSS)**:TSS用于保存和恢复任务状态,包括寄存器值、段选择子、I/O许可位图等,使得任务切换更为高效和安全。 10. **环形保护**:保护模式下的环形保护模型分为四个环:Ring 0(操作系统)、Ring...

    80x86保护模式系列教程

    保护模式支持任务状态段(Task State Segment, TSS),使得处理器能安全地切换不同任务。TSS保存了任务的上下文信息,包括寄存器状态、堆栈指针等,使得任务切换时可以快速恢复到之前的状态。 八、虚拟8086模式 ...

Global site tag (gtag.js) - Google Analytics