注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

14章 不同特权级调用门测试与分析  

2013-04-13 15:08:58|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
相同特权级的程序通过调用门调用时,不会发生栈切换.

低特权级的程序调用高特权级的例程,如果该例程是非依从的,则只能通过调用门.

低特权的程序通过调用门调用高特级的例程时,要发生栈切换,任何时候,栈段选择子的DPL=当前特权级CPL.
栈切换工作由CPU的固件自动完成,CPU固件根据TSS中登记的内容自动进行栈切换操作.

从低特权级的程序(通过调用门)切换到高特权级的例程时,CPU会访问TR寄存器,根据TR寄存器的内容,定位TSS,然后从TSS中登记的内容找到高特权级例程所对应的栈段选择子与栈指针. 
CPU先临时保存当前SS与ESP的值,然后用TSS中对应的内容修改SS与ESP.修改完成以后,把之前保存的SS,ESP压到当前栈中.  如果 调用门例程 需要用栈传递参数,CPU固件根据调用门描述符中参数的个数,依次从原先的栈(低特权级栈) 复制参数到新栈(高特权级栈)并修改栈指针,完成参数复制以后,把需要返回的CS与EIP(低特权级程序返回点)压栈.

上面是从低特权级的程序切换到高特权级程序时的流程.下面我们来看一下从高特权级例程返回低特权级代码时的情形:

从高特权级的例程返回时,会用到 retf 指令.  retf指令就是从栈中取出EIP与CS然后修改EIP与CS,如此而已.但从高特权级的代码转移到低低特权级的代码时,会发生栈切换.
CPU固件首先会比较栈中要返回的代码段DPL与当前CPL.如果他们的特权级相同,则无需栈切换.如果特权级不相同,则会发生栈切换.

如果调用门使用栈传递参数,那么调用门例程在返回时需要使用 retf n来跳过栈中的参数,让ESP指针指向之前保存的SS:ESP的原值.
CPU固件依靠 retf n 指令中的 n的值*4 来越过参数,从栈中取出栈指针与栈段选择子的数值来修改SS 与ESP的值,然后根据retf n指令中n的值来调整ESP的值 这时候,不需要调用者平衡栈指针,CPU固件自动帮你完成了.

下面说一下TSS:
TSS的内容是静态的,在任务切换过程中,TSS中登记的SS与ESP的值不会发生改变.

作者关于调用门的一个回答:
当调用门返回时,你必须弹出压在cs和eip上面的参数,才能保证retf的正常执行,就这么简单。




  评论这张
 
阅读(81)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017