目录:

  • 什么是任务

  • 任务由什么组成

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

  • 参考文献

什么是任务

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


任务由什么组成

任务由两部分组成:

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

  • 任务状态段(TSS)

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

从下至上,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)寄存器存在的原因——标识了当前任务。

可以看到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并不参与特权级检查),因此我们可以说任务门选择符提供了对一个任务的间接访问。

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

      介绍完了任务门描述符,可以告诉大家一个结论:任务只能通过任务门描述符或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》

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

  1. 操作系统开发系列—2.进入32位保护模式

    源码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 ...

  2. x86汇编语言从实模式百度云_x86汇编语言:从实模式到保护模式

    x86汇编语言:从实模式到保护模式2013年1月由电子工业出版社出版发行,总共6000行的源代码,全方位地向读者展现汇编语言程序设计之美.尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们 ...

  3. 李忠 X86汇编语言 从实模式到保护模式-初学

    学习资料: 教学视频 网易云课堂 哔哩哔哩 原书网站 原书相关源码附件下载 网友帖子 除了后面没有图片之外很不错的笔记总结,写者很用心 留存待看,一片文章写了特点 很有特色总结的笔记 学习目标: 15 ...

  4. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  5. X86汇编语言从实模式到保护模式11:指令格式及操作尺寸

    目录 1. 80286的16位保护模式 1.1 80286寄存器 1.2 80286段描述符 1.3 80286保护模式内存访问 2. 指令操作尺寸 2.1 指令操作尺寸的概念 2.2 16位处理器的 ...

  6. X86汇编语言从实模式到保护模式10:进入保护模式

    目录 1. 全局描述符表GDT 1.1 段描述符与描述符表 1.2 全局描述符表的定义 1.3 全局描述符表寄存器GDTR 1.3.1 GDTR用途 1.3.2 GDTR构成 1.3.3 lgdt指令 ...

  7. X86汇编语言从实模式到保护模式09:32位x86处理器编程架构

    目录 1. IA-32架构的基本执行环境 1.1 寄存器的扩展 1.1.1 通用寄存器的扩展 1.1.2 IP寄存器的扩展 1.1.3 FLAGS寄存器的扩展 1.1.4 段寄存器的扩展 1.2 32 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述...

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  9. X86汇编语言从实模式到保护模式12:存储器的保护

    目录 1. 进入32位保护模式 1.1 创建GDT表 1.1.1 空描述符 1.1.2 数据段描述符 1.1.3 代码段描述符 1.1.4 代码段别名描述符 1.1.5 栈段描述符 1.2 mov d ...

最新文章

  1. java.lang.NumberFormatException: For input string: “xxxx.“
  2. Linux(五):Ubuntu 16.04 更改系统语言为简体中文(Chinese simplified)
  3. 酒店客房管理系统任务汇报1
  4. SVN配置 svn:needs-lock commit提交后,图标为灰色,文件为只读。
  5. HQChart 股市图表
  6. fir.im Weekly - 2016 年 Android 最佳实践列表 1
  7. 1063 Set Similarity (25 分) set注意查询从1到q所以输入的时候也要从1到n
  8. Lingo 实现线性规划求解模型
  9. android视频编辑功能,万能视频编辑器
  10. GFlags使用总结
  11. 【数据安全】一、数字签名、数字证书、数据加密
  12. mysql根据idb还原数据_转一篇文章:MySQL 通过idb文件恢复Innodb 数据
  13. 企业微信调试H5页面
  14. 循环链表之双循环链表
  15. 学python后的感想_学习python的感想
  16. python降低图片分辨率_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...
  17. Qt中的动态数组——QList
  18. 市面上的计算机培训机构 哪家实力最强
  19. 百家争鸣:2019大数据预测
  20. 游戏开发中常用的数据结构和算法

热门文章

  1. 03Template Method模式
  2. C++中虚函数可以是内联函数吗?
  3. mysql 5.5 编译参数_Mysql 5.5 编译参数
  4. 3D 激光雷达地图相对精度自动评价算法
  5. CVPR 2020 SLAM挑战赛冠军方案解读,搞定超难数据集TartanAir
  6. tomcat自动重启脚本
  7. Chemistry.AI | 基于循环神经网络(RNN)预测分子性质
  8. 单个神经元在深度网络中的作用
  9. java tessbaseapi,T+开发者社区
  10. 如何卸载 python setup.py install 安装的包?