上一篇文章学习了:保护模式七:调用门与依从的代码段----特权级保护
主要学习了以下内容:

描述符特权级(目标对象的特权级)DPL

  • 描述符特权级(目标对象的特权级)DPL

  • 当前特权级CPL

  • 低特权级的应用调用高特权级的操作系统代码的两种方法

    • 第一种方法是将高特权级的代码段定义为依从的
    • 第二种方法是使用调用门
  • 请求特权级RPL

今天接着上一篇文章学习:

  • 任务切换的方法

1、回顾

从80286开始,处理器是面向多任务系统而设计的。在一个多任务的环境中,可以同时存在多个任务,每个任务都有自己的局部描述符(LDT)和任务状态段(TSS)。可以在多个任务之间切换,使它们轮流执行,从一个任务切换到另一个任务时,具体的切换过程是处理器固件负责进行。

但是什么时候切换到另一个任务,以及切换到哪一个任务,这是操作系统的责任,处理器只负责具体的切换过程,包括保护前一个任务的现场。

有两个基本的任务切换方法,一种是协同式的,从一个任务切换到另一个任务时,需要当前任务主动的请求暂时放弃执行权,或者在通过调用门请求操作系统服务时(系统会调用),由操作系统‘趁机’将控制转移到另一个任务。

另一种方式是抢占式的。在这种情况下,可以安装一个定时器,并在中断服务程序中实施任务切换。硬件中断信号总会出现,不管处理器当时在做什么,中断总会按时到来,而任务切换就能准时进行。在这种情况下,每个任务都能获得平等的执行机会。抢占式多任务将放在后面:保护模式八进行学习。这里我们只学习多任务切换的一般工作原理。

2、任务切与特权级控制转移的区别

在上一篇文章点击查看。我们学习了特权级相关的概念。知道了特权级实际上是针对同一个任务的局部空间与全局空间之间的控制转移保护而存在的。注意,我们说特权级是针对同一个任务的,这一点需要理解,因为不同的任务之间就算特权级不一样,也是可以进行人去切换的。比如用户线程与内核线程,这肯定是可以进行切换的。

上面的怎么理解呢?

实际上,操作系统出了为每一个任务提供服务外,也会有一个作为任务而独立存在的部分,而且是0特权级的任务。当计算机启动进入保护模式,直接创建和执行操作系统的0特权级任务,然后可以从该任务切换到其他任务,不管它们是哪个特权级的。

如下图是一个任务切换和在任务内进行特权级间的控制转移示意图:

很明显,任务切换与特权级控制转移不是一回事!!!

3、任务切换的方法

3.1 借助于中断—任务门

这是现代抢占式多任务的基础。原因很简单,只要中断没有被屏蔽,它就能随时发生。特别是定时器中断,能够以准确的时间间隔发生,可以用来强制实施任务切换。

我们知道在实模式下,内存最低地址端的1KB是中断向量表,保存着256个中断处理过程的段地址和偏移地址。当中断发生时,处理器把中断号乘以4,作为索引号访问中断向量表,从相应的位置取出中断处理过程的段地址和偏移地址,并转移到那里执行,

而在保护模式下,中断向量表不再使用,取而代之的是中断描述符表。它和GDT,LDT是一样的,用于保存描述符。它保存的是门描述符。 包括中断门,陷阱门和任务门。这些门和我们之前学过的调用门非常类似。当中断发生时,处理器用中断向量表乘以8(因为每个描述符占8字节),作为索引访问中断描述符表,取出门描述符。门描述符中有中断处理过程的代码段选择子和段内偏移量,这和调用门是一样的。接着,转移到相应位置去执行。

一般的中断处理可以使用中断门和陷阱门。它们两的本质与调用门类似,都是任务内的控制转移。从任务的局部空间转移大全局空间。

但是当中断发生时,中断号对应的是任务门,那就不一样了。此时就是进行任务切换-----即终止当前任务的执行,切换到另一个任务执行。

如下图是一个任务门描述符的格式:

其中:

  • TSS选择子: 执行任务切换时,必须找到新任务的选择子。
  • P位:任务门的P位指示该门是否有效,p=0时,不允许使用此门实施任务切换;
  • DPL:任务门描述符的特权级,但是对因中断而发起的任务切换不起作用,处理器不按特权级施加任何保护。当以非中断的方式使用任务门进行任务切换,就需要用到DPL

下面总体概述一下如何使用任务门来进行任务切换:

  1. 当中断发生时,处理器用中断号乘以8作为索引访问中断描述符表。当它发现这是一个任务门描述符时,就知道应当发起任务切换。
  2. 取出任务门描述符。
  3. 从任务门描述符中取出新任务的TSS选择子;
  4. 再用TSS选择子访问GDT,取出新任务的TSS描述符
  5. 在执行新任务前,处理器会把当前任务状态保存起来。也就是将当前任务的状态保存到TR寄存器指向的TSS状态段。
  6. 然后处理器访问新任务的状态段TSS,并从中恢复各个寄存器的内容,包括通用寄存器、标志寄存器EFLAGS、段寄存器、指令指针寄存器EIP、栈指针寄存器ESP,以及局部描述符表寄存器LDTR等。
  7. 最终任务寄存器TR指向新任务的TSS,而处理器开始新任务的执行。
  8. 一旦新任务开始执行,处理器固件会自动将其TSS描述符的B位置1,表示该任务状态为忙。

4 总结

以上只是大概学习了任务切换的一般过程以及任务门描述符的基本概念。我们需要注意任务切换与特权级的控制转移之间的区别。后序还会有详细的内容。

详细的内容还是要参考原书籍,这里只是做一个简单的总结。

学习探讨加个人:
qq:1126137994
微信:liu1126137994