js调用:通过调用门的转移

当段间转移指令JMP和段间指令CALL所含指针选择子指示门描述符时就可以实现通过转移但只有CALL指令能变换到内层特权级JMP指令只能转移到同级代码
门描述符转移入口点包含目标地址段及偏移量48位全指针在执行通过任务门段间转移指令JMP或段间指令CALL时指令所含指针内选择子用于确定而偏移被丢弃;把门内48位全指针作为目标地址指针进行转移
处理器采用与访问数据段相同特权级规则控制对门描述符访问门描述符DPL规定了访问该门最外层特权级在取出门内48位全指针把它作为目标地址指针向目标代码段转移之前要进行特权级检查只有在相同级或者更内层特权级才可访问即CPL<=DPL同时还要求指示门选择子RPL必须满足RPL<=DPL条件检测通过后才开始向目标代码段转移步骤其中还要检测目标描述符是否为代码段描述符门内选择子指示描述符必须是代码段描述符此外在装载代码段描述符高速缓冲寄存器之前调整代码段选择子RPL=0也即门中代码段选择子RPL被忽略
在装载CS高速缓冲寄存器时还要对目标代码段描述符进行保护检测检测过程中DPL不再是DPL而是门内选择子所指示目标代码段描述符DPL段间指令CALL和段间转移指令JMP所做检测不
对于使用段间转移指令JMP检测条件与段间直接转移相同由于已置RPL=0所以可认为RPL<=DPL条件总能满足所以对于普通致代码段当CPL=DPL时发生无特权级变换转移;对于致代码段在满足CPL>=DPL时也发生无特权级变换转移;其它情形就引起异常
对于使用段间指令CALL情形就不同了由于已置RPL=0所以可认为RPL<=DPL条件总能满足对于致代码段在满足CPL>=DPL时发生无特权级变换转移对于非致代码段当CPL=DPL时仍发生无特权级变换转移;当CPL>DPL时就发生向内层特权级变换转移门中选择子和偏移装入CS和指令指针EIP中并使CPL保持等于DPL同时切换到内层堆栈
综上所述使用段间指令CALL通过门可以实现从外层进入内层(JMP指令只能实现无特权级变换转移);通过门也可实现无特权级变换转移需要注意JMP指令和CALL指令都不能实现向外层特权级转移否则会引起异常
当然CALL指令在最后把目标代码段指针装入CS和EIP之前要把原CS和EIP即返回地址保存到堆栈如无特权级变换堆栈保持不变返回地址就保存在原堆栈中;否则返回地址保存在内层堆栈中
Tags:  java调用存储过程 调用存储过程 系统调用 js调用

延伸阅读

最新评论

发表评论