x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

目录:

  • 什么是任务

  • 任务由什么组成

  • 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符?

  • 参考文献

6790f2d55266b367cd3fd05339614c36.gif

什么是任务

      任务(task)是处理器可以分配、执行、挂起的工作单位,笔者认为和我们操作系统中谈论的进程(process)概念是一致的,在我cpu看来是任务,在你操作系统看来是进程,两者各自为其提供了支持,CPU为任务提供执行空间和任务状态段等硬件支持,操作系统也会为每个进程创建TCB数据结构存储进程相关信息。这个稍后再谈,现在我们只要知道任务这个概念就可以了,通常系统必须定义一个任务,复杂系统可以使用处理器的任务管理机制来支持多任务。


任务由什么组成

      任务由两部分组成:

  • 任务执行空间:代码段、数据段、栈段等等,说白了就是为任务分配分配的运行空间。

  • 任务状态段(TSS)

      处理器专门为任务设置了一个段,称之为任务状态段,既然是一个段,必然有段描述符和段选择符,段选择符的格式不会变,通常为16位,包含13位索引,1位指示GDT或LDT,最后两位RPL,段描述符的格式如下所示d8de3533cb1f629ed16e4c31d4d39626.png      可见其中包含了TSS的段基地址和段界限,很明显,段的界限+1为TSS段的大小,现在来看一下TSS的结构:

26316063f7ab52e5c6a634493688a092.png

      从下至上,previous Task Link字段中放入了前一个任务的TSS选择符,当A任务通过call指令调用B任务,任务切换时就会将该字段填入A任务的TSS选择符,确保当B任务返回时,可以返回到A任务。然后就是三个特权级下的栈基地址和栈偏移指针。接着是CR3控制寄存器,里面有分页机制的页目录基地址,每个任务的页目录基地址不同,因此也要好好保存起来,接下来的字段保存了32位模式的16个寄存器(8个通用寄存器、6个段寄存器、EIP寄存器和EFLAGS寄存器),这样的话当前任务的代码段、数据段、栈段以及其他状态我们都保存了下来。当然还有LDT段选择符,每一个任务都有其自己的LDT段。

      剩下的三个字段其实我们不需要太关注,这里简单提一下。T位表示如果T位为1,那么在任务切换到该任务时会引起异常,为0则不引起。最后的I/O Map Base Address Field字段里面放的是从TSS基地址开始到I/O permission bit map和interrupt redirection bit map的16位偏移地址(注意,这里面隐含的信息在于这些bitmap其实是放在TSS里面的,即TSS并不是我们上图看到的固定大小108字节的,否则TSS描述符的段界限字段就没用了不是),当这个字段被设置时,这16位指向I/O permission bit map的起始位置和interrupt redirection bit map的结束位置。这两个map我们暂时不用知道其含义,只需要知道和任务的I/O有关。最后是Shadow Stack Pointer(SSP)字段,无需了解。

      上面对任务状态段(TSS)进行了简单的描述,里面存储了任务的全部信息,因此在多任务系统下,我们只需要找到一个任务的TSS段选择符,通过描述符去GDT中(通常TSS段描述符是不放在LDT中的,每个任务都有一个TSS段和LDT段,应该放在全局空间才合理,但你非要放在LDT中也不是不行,处理器也是允许的)找TSS段描述符,通过描述符中段基址和段界限字段确定TSS段的地址和长度,就可以找到描述一个任务的完整信息啦!所以CPU只需要提供一个硬件来存放选择符,就可以获取任务的全部信息,这就是TR(Task Register)寄存器存在的原因——标识了当前任务。

e911befb1d3ae058db2b8652fb721af1.png

      可以看到TR是一个16位寄存器,其中存放着当前任务的TSS段选择符,当处理器将任务的TSS段选择符加载到TR中时,也会将TSS段描述符中的段基址和段界限字段放到TR的不可见部分(不可见即程序员不可以通过机器指令直接访问该寄存器),这样的话,每次访问当前任务的TSS,就不用查GDT表,找描述符,获取到段基址,而是直接根据TR不可见部分中的段基址就可以访问到TSS段,提高了效率。

小知识:LTR和STR指令可以用来改变TR中的可见部分。其中LTR是特权级指令,STR是非特权级指令,但当CR4.UMIP = 1时,STR则只能被CPL=0的程序执行。

当处理器power up或reset时,TR的段选择符和基地址字段被设置为全0,段界限字段设置为FFFFH


任务门描述符是什么东东,为什么有了TSS描述符还要有任务门描述符?

      Intel CPU手册中提到:“处理器定义了五个任务相关的数据结构:1. Task-state segment、2. Task-gate descriptor、3.TSS Descriptor、4. Task Register 5. NT flag in the ELAGS register”。其中1、3、4我们在上面已经提过,这里进行一个简单的重温,TSS实际上是一个段,其中存放着描述任务的所有信息,段必然有描述符,这就是TSS Descriptor,描述符里面存放了TSS的段基址和段界限等信息,有描述符必然得有选择符吧,TR作为硬件,就存放了TSS的段选择符。

      下面我们来说说二,中文名字任务门描述符,他和TSS描述符有什么关系吗?答案是任务门描述符中存放了用于索引TSS描述符的选择符。(选择符中的RPL没有用,这就代表其选择符的RPL并不参与特权级检查),因此我们可以说任务门选择符提供了对一个任务的间接访问。

8c3e69dd9426ac04b17a5ea5c11c0823.png      他可以放在LDT、GDT和IDT中。(但通常来说TSS描述符只放在GDT中,至于为什么,我们接下来讲述。

d1d4eb779d51a39345a0dbcf2a571a3e.png      介绍完了任务门描述符,可以告诉大家一个结论:任务只能通过任务门描述符或TSS描述符来访问。看到这里大家有没有一个疑惑:有了TSS描述符为什么还需要任务描述符来间接访问任务啊?岂不是多此一举?下面笔者就为大家解答疑惑。

      Intel CPU手册中说,上面这两个结构必须满足以下要求:

  • Need for a task to have only one busy flag(一个任务只能有一个busy位)

      不知道大家看TSS描述符时是否看到了的Type.B位?其含义为当前任务是否忙(busy),关于这个位的具体含义稍后解释,我们需要知道的是,Intel规定一个任务只能有一个busy位,由于任务的busy位存储在TSS描述符中,因此每一个任务只能有一个TSS描述符,然而,可以存在好几个任务门描述符指向相同的TSS描述符。

  • Need to provide selective access to tasks(任务需要有可选择访问权限)

      通常TSS描述符中的DPL为0,应用程序没有权限访问,但是任务门描述符可以和TSS描述符具有不同的DPL(通常数值上高于TSS描述符DPL),从而为低特权级程序提供访问任务的方式。这样的任务门描述符通常在LDT中。

  • Need for an interrupt or exception to be handled by an independent task(可以用任务来处理中断和异常)

      任务门可以放在IDT中从而允许任务来处理异常和中断,当中断和异常向量指向任务门,处理器会执行任务切换,切换到指定的程序。

      现在是不是有些明了了?(不明白欢迎讨论),任务门描述符可以提供这么多作用,这也就是它存在的原因。

      现在讲完了1. Task-state segment、2. Task-gate descriptor、3.TSS Descriptor、4. Task Register,还剩个5,这涉及到了任务切换的相关知识。且听下回分解。


参考文献

[1]  Intel CPU手册https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html

[2] 《x86汇编语言 从实模式到保护模式》

[3] 《Oranges's》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值