x86汇编之任务切换
分类:
文章
•
2025-04-11 17:54:10
前言
- 任务切换可以分为协同和抢占
- 协同就是任务自己主动交出控制权,抢占就是利用中断,强制从任务手中获得控制权
N位
- 任务门和调用门类似,任务门描述符可以放置在GDT,LDT中
- 当发生中断的时候,中断号x8+中断描述符表基地址,当CPU辨别这是一个任务门的时候就执行任务切换
- 除此之外,还可以通过 call 任务门或者call TSS选择子进行任务切换
- 矛盾在于用iret返回的时候,怎么鉴别是从中断返回还是从任务返回
- 在EFLAGS里面有一个N位,当该位是1时,表明当前任务属于嵌套在其他任务之中,那么就属于从任务返回
- 当中断或者Call 发生执行任务切换会发生任务嵌套,将当前任务的所有状态进行保存,不改变N位和B位,将下一个任务TSS的任务链接域指向上一个任务,并且将B位和N位置为1
- 当用Jump的时候并不会,将当前B位置0,不改变N位。然后加载下一个任务的TSS进TR,并将其B位置1,不改变N位
- 任务切换不允许重入
- A切换到A无法进行状态保存
- ABC任务嵌套,C再去嵌套A,就会导致死循环
- 通过中断发生的任务切换,不检验特权级
- 数据访问的特权级检查规则适用于jmp和call指令,当前任务的cpl和新任务段选择子的RPL必须在数值上小于或者等于目标TSS或者任务门的DPL。异常,中断和iret指令引起的任务切换忽略目标任务门或者TSS描述符DPL。对于以int n 指令产生的中断,要检查DPL
- 通过B位来检验。
IOPL
- 在处理器的标志寄存器EFLAGS中,位13,位12是IOPL,也就是输入/输出特权级,它代表着当前任务的I/O特权级别
- 如果当前特权级CPL高于,或者和任务的I/O特权级IOPL相同时,所有I/O操作都是允许的
- 处理器不限制0特权级程序的I/O访问,总是允许的