TSS----任务切换的核心

 任务切换的核心在于TSS。
      TSS(Task State Segment)是一个任务存在的标志。一个任务可以没有自己的LDT,但是一定要有TSS。保护模式下的处理器的一个设计目标就是支持多任务。TSS是为了达到此目标而引入的最重要的数据结构。TSS和任务唯一对应,保存有任务运行状态相关的所有必要信息。任何时候,只要获知一个任务的TSS,就相当于获知了该任务现在运行在了什么地方,所有寄存器是什么值,LDT在哪儿,等等,故而可以跳转到此任务,让此任务继续运行——这就是任务切换的本质。
      有三种任务切换方式:中断,call,jmp。其中,中断是最常见的任务切换方式,经常用于操作系统内的任务调度。通过call与jmp的任务切换则由代码主动发起。从本质上来说,这三种任务切换方式的“输入参数”都是TSS。但是任务门作为中介在中断方式中被使用,而call与jmp指令则既可以间接以指向任务门的描述符为输入参数,也可以直接用TSS选择子为输入参数。几个相关的数据结构的关系如下所示。                                                   
                                                   中断发生  或者  call  或者 jmp
                                                                |
                                                                |
                                                             (任务门)
                                                                |
                                                                |
                                                            TSS选择子
                                                                |
                                                                |
                                                               TSS
上图的意思是:当TSS作为中断或者call或者jmp的输入参数时,CPU会发起任务切换,切换到TSS所指向的那个任务。TSS由TSS选择子指向,而TSS选择子又可选的(中断则是必须)被任务门指向(实则是作为一个域包含在内)。
中断和call引起的任务切换都可以通过iret指令返回。中断和call引起的任务切换都是所谓“嵌套式”任务切换。从旧任务切换到新任务时,旧任务以TSS选择子的方式反向链接在新任务的TSS中,且新任务EFLAG中的NT(Nested Flag)位被置1。同时,虽然CPU已经从旧任务切换到新任务,但是旧任务TSS中的B(Busy)位依然保持为1。嵌套式的任务切换倒更像是在同一个任务内不同过程之间的跳转。相比之下,jmp所引起的任务切换则“更像”是任务切换,它并不导致嵌套关系的发生。旧任务的B位清零,新任务EFLAG中的NT位被清零。
       总之,任务切换的核心在于TSS。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值