X86栈切换,任务切换

栈切换:

从TSS中选取目标DPL栈,读出段选择子和ESP;
–>使用选择子读取栈描述符,检查特权级,类型等;
–>临时保存旧栈(当前栈)SS, ESP;(1)
–>新栈选择子, ESP代入SS, ESP, 切换新栈;
–>将(1)保存的旧栈SS, ESP压入新栈(保护现场);
–>根据调用门描述符 ‘参数个数’,从旧栈中读出压入新栈;
–>压入CS, EIP(保存现场);
–>从调用门描述符中读出段选择子+偏移–>CS:IP, 开始调用;

任务切换:

1.中断切换:
中断发生–>中断号*8(描述符8B)访问中断向量表;
–>为任务门进行任务切换,否则普通中断处理;
–>取出任务门描述符–>从描述符中取出新任务TSS选择子;
–>用选择子访问GDT取得新任务TSS描述符;
–>将当前任务状态存到TR->TSS中;
–>访问新TSS,从中恢复:通用Reg,EFLAGS,段Reg,EIP,ESP,LDTR等;
–>TR指向新TSS(切换完成);
–>开始执行新任务(一旦新任务开始,CPU固件置TSS中B为’1’,忙);

2.CALL,JUMP切换:
操作数是TSS选择子/任务门, 首先根据选择子访问GDT,指令中32位偏移忽略,全部从TSS中获得;

3.注意点:
CALL和中断发起的切换时嵌套的,旧任务:TSS’B’置’1’,EFLAGS’NT’不变,新任务:TSS’B’置’1’,EFLAGS ‘NT’置’1’,TSS任务链域填旧TSS选择子;
JMP发起的切换不会形成嵌套,旧TSS’B’置’0(非忙),EFLAG’NT’不变,新任务TSS’B’置1,EFLAGS’NT’保持从TSS加载时的状态;

返回过程:

1.同级特权级:栈中弹出调用者代码段选择子和之灵指针;
2.特权级变化的远返回,只能返回到低特权级;
3.全部过程:
检查栈中CS,根据RPL决定返回时是否需要改变特权级;
–>针对代码段描述符和选择子RPL进行特权级检查;
–>若远返回带参数,ESP+参->调用者SS,ESP(被调用者栈);
–>若返回要改变特权级,SS、ESP压栈,切回调用者栈;
–>若远返回带参数,ESP+参 平衡栈 (调用者栈);
–>若返回要改变特权级,检查DS,ES,FS,GS找到对应描述符,要是有任意DPL<调用者CPL(当前CPL),CPU将0传给该Reg;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值