TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33

TSS(Task State Segment,任务状态段)详解

1. TSS描述符

和LDT一样,必须为每个TSS在GDT中创建对应的描述符。TSS描述符的格式如下图:


B位是“忙”位(Busy)。在任务刚刚创建的时候,它应该为0,表明任务不忙。当任务开始执行时,或者处于挂起状态(临时被中断执行)时,由处理器固件把B位置1.

任务是不可重入的。就是说在多任务环境中,如果一个任务是当前任务,那么它可以切换到其他任务,但是不能从自己切换到自己。在TSS描述符中设置B位,并由处理器固件进行管理,可以防止这种情况的发生。

2. TSS的格式

在一个多任务环境中,当任务发生切换时,必须保存现场(比如通用寄存器,段寄存器,栈指针等)。为了保存被切换任务的状态,并且在下次执行它时恢复现场,每个任务都应当有一片内存区域,专门用于保存现场信息,这就是任务状态段(Task State Segment)。

在创建一个任务的时候,我们要为这个任务创建TSS并填写其中的一些字段。

  1. 前一任务链接(TSS Back Link):TSS内偏移0处是前一个任务的TSS描述符的选择子。
    当Call指令、中断或者异常造成任务切换,处理器会把旧任务的TSS选择子复制到新任务的TSS的Back Link字段中,并且设置新任务的NT(EFLAGS的bit14)为1,以表明新任务嵌套于旧任务中。关于这点我们会在第15章学习。在创建一个任务的时候,这个字段可以填写0.

  2. SS0,SS1,SS2和ESP0,ESP1,ESP2分别是0,1,2特权级堆栈的选择子和栈顶指针。这些内容应当由任务的创建者填写,且属于填写后一般不变的静态字段。

  3. CR3和分页有关,我们会在第16章学习。如果没有启用分页,可以填写0.

  4. 偏移为0x20~0x5C的区域是处理器各个寄存器的快照部分,用于任务切换时保存现场。在一个多任务环境中,每次创建一个任务,内核至少要填写EIP,EFLAGS,ESP,CS,DS,SS,ES,FS和GS。当任务首次执行时,处理器从这些寄存器中加载初始执行环境,从CS:EIP处开始执行任务的第一条指令。

  5. LDT选择子是当前任务的LDT选择子,由内核填写,以指向当前任务的LDT。该信息由处理器在任务切换时使用,在任务运行期间保持不变。

  6. T(Debug Trap)位用于软件调试。在多任务环境中,如果T=1,则每次切换到该任务的时候,会引发一个调试异常中断(int 1).

  7. I/O位图基地址用来决定当前的任务是否可以访问特定的硬件端口。关于这个,下文会具体说明。

3. I/O许可位图(I/O Permission Bit Map)

EFLAGS寄存器的IOPL位决定了当前任务的I/O特权级别。如果在数值上CPL<=IOPL,那么所有的I/O操作都是允许的,针对任何硬件端口的访问都可以通过;如果在数值上CPL>IOPL,也并不是说就不能访问硬件端口。事实上,处理器的意思是总体上不允许,但个别端口除外。至于个别端口是哪些端口,要找到当前任务的TSS,并检索I/O许可位图。

I/O许可位图(I/O Permission Bit Map)是一个比特序列,因为处理器最多可以访问65536个端口,所以这个比特序列最多允许65536比特(即8KB)。

如下图中的绿色部分,第一个字节代表端口0~7,第二个字节代表端口8~15,以此类推。每个比特的值决定了相应的端口是否允许访问。为1时禁止访问,为0时允许访问。

在TSS内偏移为102字节的那个字单元,是I/O位图基地址字段,它指明了I/O许可位图相对于TSS起始处的偏移,例如下图中这个字段的值是144.

有几点需要说明:
1. 如果I/O位图基地址的值>=TSS的段界限(就是TSS描述符中的段界限),就表示没有I/O许可位图。
2. 处理器要求I/O位图的末尾必须附加一个全1的字节,即0xFF.
3. 处理器不要求为每一个I/O端口都提供位映射,对于那些没有在位图中映射的位,处理器假定它对应的比特是1(禁止访问)。
4. TSS描述符中的界限值包括I/O许可位图在内,也包括最后附加的0xFF. 以下图为例,TSS的界限值是149(总大小150减去1)。

【end】

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值