从实模式到保护模式 15 章 任务切换

在一个多任务环境中,可以同时在多个任务,每个任务都有自己的ldt和tss.可以在多个任务之间切换,使它们轮流执行.从一个任务切换到另一个任务时,具体的切换是由处理器固件负责进行的.

什么时候切换,切换到那个任务时由操作系统负责的,处理器负责切换的具体过程,包括保护前一个现场(段寄存器,通用寄存器),恢复新任务运行的环境.

有两种基本的切换任务的方式

  1. 协同式 当任务切换时,当前的主动请求放弃执行权.(这种方式依赖自律性,当一个任务失控时,其他任务可能得不到执行的机会)
  2. 抢占式 安装一个定时中断器,并在中断服务发生时实施任务切换.每个任务都能获得平等的机会.

在一个任务内,全局空间和局部空间具有不同的特权级别,使用门可以在任务内将控制从3特权级的局部空间转移到0特权级的全局空间,使用内核操作系统提供的服务.(调用门,放在ldt和gdt中)
在这里插入图片描述

系统切换至少要有两个任务,而且已经有一个正在执行,在上一章中,我们创建一个特权级别是3的任务,一开始,在全局空间执行,当前特权级是0,通过一个虚假的调用门返回,使处理器回到任务的局部空间执行.这很别扭.

一旦进入保护模式,就直接创和执行操作系统的0特权级任务.可以从该任务切换到其它任务.不管它们是那个特权级别的.在这一章中,就要先创建0特权级的内核.

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

         ;为程序管理器的TSS分配内存空间 
         mov ecx,104                        ;为该任务的TSS分配内存
         call sys_routine_seg_sel:allocate_memory
         mov [prgman_tss+0x00],ecx          ;保存程序管理器的TSS基地址 
      
         ;在程序管理器的TSS中设置必要的项目 
         mov word [es:ecx+96],0             ;没有LDT。处理器允许没有LDT的任务。
         mov word [es:ecx+102],103          ;没有I/O位图。0特权级事实上不需要。
         mov word [es:ecx+0],0              ;反向链=0
         mov dword [es:ecx+28],0            ;登记CR3(PDBR)
         mov word [es:ecx+100],0            ;T=0
                                            ;不需要0、1、2特权级堆栈。0特级不
                                            ;会向低特权级转移控制。
         
         ;创建TSS描述符,并安装到GDT中 
         mov eax,ecx                        ;TSS的起始线性地址
         mov ebx,103                        ;段长度(界限)
         mov ecx,0x00408900                 ;TSS描述符,特权级0
         call sys_routine_seg_sel:make_seg_descriptor
         call sys_routine_seg_sel:set_up_gdt_descriptor
         mov [prgman_tss+0x04],cx           ;保存程序管理器的TSS描述符选择子 

         ;任务寄存器TR中的内容是任务存在的标志,该内容也决定了当前任务是谁。
         ;下面的指令为当前正在执行的0特权级任务“程序管理器”后补手续(TSS)。
         ltr cx   

第一种切换的方法是借助于中断,这也是现代抢占式多任务的基础.只要中断没有被屏蔽,它就随时能发生.特别是定时中断器,能够以准确的时间间隔发生,可以用来强制实施任务切换.保护模式下,中断向量表不再使用,用的是中断描述符表,它保存的是门描述符,包括中断门,陷阱门和任务门.当中断发生时,处理器用中断号乘以8,作为索引访问中断描述符表,取出门描述符.门描述符中有中断处理过程的代码段选择子和段内偏移量.

中断可以使用中断门和陷阱门,本质上也是一种任务内的控制转移行为.

如果中断号对应的是任务门的话就进行任务切换.任务门描述符
(不同特权级用调用门,中断门,陷阱门作为中断处理过程使用,任务门对应着任务的切换)

任务门的主要成份是tss选择子.
在这里插入图片描述
中断发生时,发现是任务门,拿出tss,当前保存到tr指的tss中.访问新的tss.

中断发生时,可以执行常规中断处理过程,也可以进行任务切换,尽管性质不同,它们都要使用iret指令返回.前者是返回到同一任务的不同代码段.后者是返回到被中断的那个任务.

eflags nt(位14),是嵌套任务的标志,tss中有一个任务链域(指向前一个任务的指针),可以填写为前一个任务的tss描述符选择子.如果nt是1,表示当前的任务嵌套于其他任务内,并且能够通过tss任务链接域的指针返回到前一个任务.

如果是中断发生的任务切换,对新任务的处理是将老任务的tss选择子填写到新任务tss中的任务链接域,同时将新任务eflags寄存器nt位置1,以允许返回到前一个任务.

如果nt位是1的话,用iret从当前任务返回到前一个任务.

除了因中断引发的任务切换之外,还可以用远过程调用 call指令,或远程跳转指令jmp,直接发起任务切换.
当处理器执行这两条指令时,先用指令中给出的描述符选择子访问gdt

  1. 如果是代码段描述符 普通段间转移执行
  2. 如果是调用门,按调用门执行
  3. tss(gdt中)描述符或任务门(gdt,ldt中),任务门
    ,如果它的描述符类型是tss描述符,或任务门[任务门在前面是在中断描述符表中的,描述符里面是一个tss选择子],则执行任务切换.任务门描述符可以安装在中断描述符表和gdt,ldt中.

call和jmp指令也有不同之处,call类似于中断发起的任务切换(中断任务门),call发起的任务切换是嵌套的.call发起的任务切换可以通过iret指令返回到前一个任务

jmp发起任务切的时,不会形成嵌套关系,当前任务的tss的b位清零,nt不变,新任务的b位是1,nt不变.

任务是不可重入的.切换时,新任务的tss的b位不能是1.

在创建一个没有执行的新任务时需要把tss填写的比较完整.因为发生任务切换时,处理器要从新任务的tss中回复加载

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值