任务切换的基本方式(简介)
协同式
从一个任务切换到另一个任务时,需要 当前任务主动地请求暂时放弃执行权,或者在通过调用门请求操作系统服务时,由操作系统将控制转移到另一个任务
任务的切换取决于每个任务的 “自律性”
抢占式
可以安装一个 定时器中断,并在 中断服务程序中实施任务切换
每个任务都能获得平等的执行权
任务切换前的设置
任务切换与任务中控制转移的区别
首先,我们要知道在 任务中控制转移 是指 控制在一个任务内的全局空间和局部空间中转移
而任务切换是指 以任务为单位,控制从一个任务转移到另一个任务中
二者的区别就在于 控制是在同一个任务中转移还是不同任务中转移
如下图所示
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 )
嵌套任务标志
当中断发生时,都需要通过 iret指令 返回
- 常规的中断处理过程返回到 同一任务的不同代码段
- 任务切换返回到 被中断的那个任务
二者都是通过相同的指令返回,处理器该如何区分呢------答案是标志寄存器EFLAGS的 NT位(第14位),即 嵌套任务标志
每个任务的TSS都有一个 任务链接域,用于指向前一个任务的TSS描述符的选择子,NT位为1,表示当前任务为嵌套任务,可以通过TSS返回到前一个任务
所以处理器通过 NT位 来判定 iret指令 该如何做
远程调用指令CALL
处理器执行call指令时,先通过描述符选择子访问GDT,然后分析对应的描述符的类型
- 代码段描述符: 常规的段间转移
- 调用门描述符: 具有特权级变换的段间转移
- 任务门描述符或TSS描述符: 任务切换
由call指令发起的任务切换是嵌套的
- 当前任务的B位和NT位不变
- 新任务的B位和NT位置1
- 新任务的TSS任务链接域改为旧任务的TSS描述符选择子
如下图所示:
远跳转指令JMP
处理器开始的步骤和call指令是一样的,访问GDT,取描述符
由JMP指令发起的任务切换不会形成任务之间的嵌套关系
- 当前任务的B位清零,NT位不变
- 新任务的B位置1,NT位不变
任务不可重入
简单来说,就是执行任务切换时,新任务的状态不能为忙,即B位应该为0
处理器通过新任务的TSS描述符的B位来检测重入
总结
任务切换实例看代码就可以了,只有20来行吧
标签:中断,描述符,mov,chapter15,任务,切换,------,TSS From: https://www.cnblogs.com/winter-z/p/18385492