任务切换的细节

        在一个多任务环境中,可同时存在多个任务。每个任务有各自的局部描述符表(LDT)和任务状态段(TSS)。在局部描述符表中存放着专属于任务局部空间的段的描述符。可在多个任务之间切换,使它们轮流执行,从一个任务切换到另一个任务时,具体的切换过程是由处理器固件负责进行的。

        所谓多任务系统,指能同时执行两个以上任务的系统。任务调度主要是操作系统的责任,处理器只负责具体的切换过程,包括保护前一个任务的现场。

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

        另一种是抢占式,这种方式下,可安装一个定时器中断,并在中断服务程序中实施任务切换。硬件中断信号总会定时出现,不管处理器当时在做什么,中断都会适时发生,而任务切换也就能顺利进行。这种情况下,每个任务都能获得平等的执行机会。且,即使一个任务失控,也不会导致其他任务没有机会执行。

15.1.本章代码清单

15.2.任务切换前的设置

        所有任务共享一个全局空间,这是内核或操作系统提供的,包含了系统服务程序和数据;同时,每个任务还有自己的局部空间,每个任务的功能都不一样,所以,局部空间包含的是一个任务区别于其他任务的私有代码和数据。

        在一个任务内,全局空间和局部空间具有不同的特权级别。使用门,可在任务内将控制从3特权级的局部空间转移到0特权级的全局空间,以使用内核或操作系统提供的服务。

        任务切换是以任务为单位的,是指离开一个任务,转到另一个任务中去执行。任务转移相对来说要复杂的多,当一个任务正在执行时,处理器的各个部分都和该任务息息相关:段寄存器指向该任务所使用的内存段;通用寄存器保存着该任务的中间结果,等等。

        离开当前任务,转到另一个任务开始执行时,要保存旧任务的各种状态,并恢复新任务的运行环境。

        即要执行任务切换,系统中需至少有两个任务,且已经有一个正在执行中。一开始,处理器是在任务的全局空间执行的,当前特权级别是0,然后,我们通过一个虚假的调用门返回,使处理器回到任务的局部空间执行,当前特权级别降为3。

        事实上这样没必要。首先,处理器刚进入保护模式时,以0特权级运行的,且执行的一般是操作系统代码,也需是0特权级别的。其次,任务不一定非得是3特权级别的,也可是0特权级别的。特别是,操作系统除了为每一个任务提供服务外,也会有一个作为任务而独立存在的部分,且是0特权级别的任务,以完成一些管理和控制功能,比如提供一个界面和用户进行交互。

        计算机加电后,一旦进入保护模式,就直接创建和执行操作系统的0特权级任务。然后,可从该任务切换到其他任务。

        既然如此,这一章,首先要创建0特权级别的操作系统(内核)任务。

        内核任务,一般作用是创建其他任务,管理它们,所以称作任务管理器,或叫程序管理器。

        任务状态段(TSS)是一个任务存在的标志,没有它,就无法执行任务切换,因为任务切换时需要保存旧任务的各种状态数据。

        程序管理器任务没有自己的LDT,任务可以没有自己的LDT,这是允许的。程序管理器可以将自己所使用的段描述符安装在GDT中。另外,程序管理器任务是运行在0特权级别上的,不需要创建额外的栈。因为除了从门返回外,不能将控制从高特权级的代码段转移到低特权级的代码段。

        在GDT中创建TSS的描述符,必须创建TSS的描述符,且只能安装在GDT中。

        为表明当前正在任务中执行,要做的最后一个工作是将当前任务的TSS选择子传送到任务寄存器TR中。

15.3.任务切换的方法

        对多任务的支持是现代处理器的标志之一。为此,Intel处理器提供了多种方法,以灵活地在各个任务之间实施切换。

        处理器并没有提供额外的指令用于任务切换。事实上,用的都是我们熟悉的老指令和老手段,但扩展了它们的功能,使之除了能继续执行原有的功能外,也能用于实施任务切换操作。

        第一种任务切换的方法是借助于中断,这也是现代抢占式多任务的基础。

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

        在保护模式下,中断向量表不再使用,取而代之的,是中断描述符表。

        它类似GDT,LDT,用于保存描述符。唯一不同的地方是,它保存的是门描述符,包括中断门,陷阱门,任务门。

        当中断发生时,处理器用中断号乘以8(因为每个描述符占8字节),作为索引访问中断描述符表,取出门描述符。门描述符中有中断处理过程的代码段选择子和段内偏移量,这和调用门是一样的。接着,转移到相应的位置去执行。

        一般的中断处理可以使用中断门和陷阱门。中断门和陷阱门允许在任务内实施中断处理,转到全局空间去执行一些系统级的管理工作,本质上,也是任务内的控制转移行为。

        但是,中断发生时,如该中断号对应的门是任务门,则,性质就截然不同了,必须进行任务切换。即,要中断当前任务的执行,保护当前任务的现场,并转换到另一个任务去执行。

        任务门描述符格式

        ---next

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/125941627