Intel80386知识总结: 多任务支持

[color=gray]====================================================================
本文用于汇总整理Intel80386的多任务支持功能,
参考文献:
[list]
[*]《INTEL 80386 programmer's reference manual 1986》
[/list]
本文是系列文章[url=http://chong-zh.iteye.com/blog/1949012]《Intel80386知识总结》[/url]的一部分。
===================================================================[/color]
[size=xx-large][color=blue]1. 任务信息的管理机构[/color][/size]
[size=x-large][color=blue]1.1 TSS[/color][/size]
处理器把维护一个任务所需的所有信息都保存在一个特殊的段中:Task State Segment(TSS)。TSS的结构如下图所示:
[img]http://dl.iteye.com/upload/picture/pic/127793/13784f9a-27b0-3fa7-aea1-4addf6f94422.png[/img]
TSS中的字段可以分为两组,一组是每次任务切换时都会更新的动态字段,另一组是只读的静态字段。动态字段包括:
[list]
[*]通用寄存器保存字段:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
[*]段寄存器保存字段:ES、CS、SS、DS、FS、GS
[*]标志位寄存器保存字段:EFLAGS
[*]指令指针保存字段:EIP
[*]前一个任务的TSS选择符
[/list]
静态字段包括:
[list]
[*]任务LDT的选择符
[*]寄存器PDBR的保存字段
[*]CPL为0~2时的堆栈段选择符,共3个
[*]T bit:Debug trap bit,等于1时,在每次任务切换时处理器都会产生一个调试异常
[*]I/O Map base:I/O用
[/list]

[size=x-large][color=blue]1.2. TSS描述符[/color][/size]
即指向TSS的段描述符,其结构如下所示:
[img]http://dl.iteye.com/upload/picture/pic/127797/f0fa5ddf-7ecf-3159-8b2d-b7e6de7503d7.png[/img]
TSS描述符TYPE字段中的B bit是TSS的忙标志位,当TYPE字段=9时,表示该任务为非繁忙任务,当TYPE字段=11时,表示该任务为繁忙任务。i386的任务是不可重入的,处理器可以通过检查任务的B bit发现任务是否繁忙。TSS描述符的LIMIT字段必须大于等于103,大于103是允许的,可以系统软件被用来存储一些相关信息。
TSS描述符只能被保存在GDT中,通过TI=1的选择符访问TSS选择符会造成异常。不能直接通过把TSS描述符载入数据段寄存器来修改其中的内容,只能通过载入另一个指向TSS的数据段描述符来修改TSS。

[size=x-large][color=blue]1.3. TR寄存器[/color][/size]
TR寄存器给出了当前任务的TSS,通过TR寄存器访问TSS的路径如下图所示:
[img]http://dl.iteye.com/upload/picture/pic/127803/c90f2f2d-7227-3338-b1cf-6b0ce8bf688d.png[/img]

[size=x-large][color=blue]1.4. 任务门[/color][/size]
i386提供任务门机制作为间接的受保护的访问TSS的方式,其结构如下所示:
[img]http://dl.iteye.com/upload/picture/pic/127829/9043db0b-aed8-3ed2-affd-afc46f2536ac.png[/img]
其中,SELECTOR字段指向TSS描述符,SELECTOR字段中的RPL是不被使用的,同时,当使用任务门时,TSS描述符中的DPL失效,优先级保护规则为:选中任务门所用的选择符RPL和CPL都必须小于等于任务门的DPL。
一个TSS只有唯一的TSS描述符与其对应,却可以有多个任务门同时指向对应的TSS。TSS描述符和任务门形成了多任务管理的两层架构:
[img]http://dl.iteye.com/upload/picture/pic/127831/8b8e8ae2-d68c-348e-ae35-3d3fe6d94684.png[/img]

[size=xx-large][color=blue]2. 任务的切换[/color][/size]
[size=x-large][color=blue]2.1 切换流程[/color][/size]
[list]
[*]检查当前任务是否有权切换到目标任务:TSS描述符或者是调用门的DPL必须小于等于CPL和调用门选择符的RPL
[*]检查目标TSS描述符的PRESENT字段是否为1,LIMIT字段是否合法,否则产生异常。异常将在切换前的任务上下文中。
[*]保存当前任务的执行现场:保存寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI、ES、CS、SS、DS、FS、GS、EFLAGS到TSS。把当前指令(造成任务切换的指令)的下一条指令地址保存到TSS。
[*]在TR寄存器中载入目标任务的TSS描述符,并设置其Busy bit。
[*]从新任务的TSS中恢复现场,并继续执行
[/list]
在上述过程中要完成的保护检查一览:
[table]
|序号|检查内容|异常类型
|1|Incoming TSS descriptor is present|NP
|2|Incoming TSS descriptor is marked not-busy| GP
|3|Limit of incoming TSS is greater than or equal to 103|TS
|4|LDT selector of incoming task is valid|TS
|5|LDT of incoming task is present|TS
|6|CS selector is valid|TS
|7|Code segment is present|NP
|8|Code segment DPL matches TS Code segment CS RPL|TS
|9|Stack segment is valid|GP
|10|Stack segment is present|SF
|11|Stack segment DPL = CPL|SF
|12|Stack-selector RPL = CPL|GP
|13|DS, ES, FS, GS selectors are valid|GP
|14|DS, ES, FS, GS segments are readable|GP
|15|DS, ES, FS, GS segments are present|NP
|16|DS, ES, FS, GS segment DPL ≥ CPL (unless these are conforming segments)|GP
[/table]
其中,异常类型的含义为:
[list]
[*]NP = Segment-not-present exception
[*]GP = General protection fault
[*]TS = Invalid TSS
[*]SF = Stack fault
[/list]

[size=x-large][color=blue]2.2 任务返回链[/color][/size]
TSS的back-link字段和EFLAGS寄存器的NT(Nested Task)标志位共同提供了i386的任务返回链机制。当由任务A切换至任务B的时候,处理器会在任务B的TSS中设置back-link字段,指向任务A的TSS选择符,同时设置任务B的EFLAGS寄存器中的NT位=1。当任务B释放控制流的时候,处理器首先检查EFLAGS的NT位是否为1,若为1则读取任务B TSS中的back-link字段自动返回。在系统运行的过程中返回链的长度可以无限增长,TSS描述符的Busy位保护了在返回链中没有环。同时,在多处理器环境下,Busy位还可以保护一个任务不被多个处理器同时执行。下表总结了Busy位,NT位和Back-link字段的具体行为逻辑:
[img]http://dl.iteye.com/upload/picture/pic/127813/cd0c6d84-420d-36f8-a471-340880ebbea7.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值