任务切换的基本方式(简介)

协同式

从一个任务切换到另一个任务时,需要 当前任务主动地请求暂时放弃执行权,或者在通过调用门请求操作系统服务时,由操作系统将控制转移到另一个任务

任务的切换取决于每个任务的 “自律性”

抢占式

可以安装一个 定时器中断,并在 中断服务程序中实施任务切换

每个任务都能获得平等的执行权

任务切换前的设置

任务切换与任务中控制转移的区别

首先,我们要知道在 任务中控制转移 是指 控制在一个任务内的全局空间和局部空间中转移

而任务切换是指 以任务为单位,控制从一个任务转移到另一个任务中

二者的区别就在于 控制是在同一个任务中转移还是不同任务中转移

如下图所示

1

0特权级别的操作系统(内核)任务

任务切换,系统至少要有2个任务,其中一个正在执行

在之前,内核是通过虚假的调用门返回,将控制权转移到用户程序中

这一章,我们先创建一个 0特权级别的操作系统(内核)任务,然后用任务切换的方法,切换到用户程序上

   ;为程序管理器的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                          

我们就让这个任务叫做 程序管理器,然后就是创建TSS并安装到GDT中,最后让处理器的TR寄存器指向该任务,表示该任务正在执行

任务切换的方法(详细)

中断(抢占式多任务)

实模式下的中断向量表

内存最低端的1KB是中断向量表,保留 256 个中断处理过程的 段地址和偏移地址,每个条目占用 4字节

中断发生时,处理器将 中断号乘4作为表内的索引来访问中断向量表,从相应位置取到 入口地址 并转移到那里执行

保护模式下的中断描述符表

中断描述符表和GDT、LDT类似,不过保留的是 门描述符,包括中断门、陷阱门、任务门,每个描述符占用 8字节

中断发生时,处理器将 中断号乘8作为表内的索引来访问中断描述符表,从相应位置取到 门描述符 并转移到指定处执行

  • 中断处理使用 中断门、陷阱门: 允许在 任务内 实施中断处理过程,转移到全局空间,本质上也是 任务内的控制转移行为

  • 中断处理使用 任务门:必须进行 任务切换,中断当前任务的执行,保留当前任务的现场,转换到另一个任务执行

如下是任务门的描述符格式,主要成份是TSS选择子( 新任务的TSS )

3

嵌套任务标志

当中断发生时,都需要通过 iret指令 返回

  • 常规的中断处理过程返回到 同一任务的不同代码段
  • 任务切换返回到 被中断的那个任务

二者都是通过相同的指令返回,处理器该如何区分呢------答案是标志寄存器EFLAGS的 NT位(第14位),即 嵌套任务标志

4

每个任务的TSS都有一个 任务链接域,用于指向前一个任务的TSS描述符的选择子,NT位为1,表示当前任务为嵌套任务,可以通过TSS返回到前一个任务

所以处理器通过 NT位 来判定 iret指令 该如何做

远程调用指令CALL

处理器执行call指令时,先通过描述符选择子访问GDT,然后分析对应的描述符的类型

  • 代码段描述符: 常规的段间转移
  • 调用门描述符: 具有特权级变换的段间转移
  • 任务门描述符或TSS描述符: 任务切换

由call指令发起的任务切换是嵌套的

  • 当前任务的B位和NT位不变
  • 新任务的B位和NT位置1
  • 新任务的TSS任务链接域改为旧任务的TSS描述符选择子

如下图所示:

6

远跳转指令JMP

处理器开始的步骤和call指令是一样的,访问GDT,取描述符

由JMP指令发起的任务切换不会形成任务之间的嵌套关系

  • 当前任务的B位清零,NT位不变
  • 新任务的B位置1,NT位不变

任务不可重入

简单来说,就是执行任务切换时,新任务的状态不能为忙,即B位应该为0

处理器通过新任务的TSS描述符的B位来检测重入

总结

7

任务切换实例看代码就可以了,只有20来行吧

 posted on 2024-08-28 22:21  Dylaris  阅读(65)  评论(0)    收藏  举报