2012年9月1日

ret向外层返回

摘要: 1,ret指令先从堆栈弹出返回地址指针(48位的selector:offset) 若selector的RPL等于当前的CPL,则直接开始向目标代码段转移的步骤,即执行jmp selector:offset 若selector的RPL大于当前的CPL,则引起向外层返回。CPL的变化也必然对应着堆栈切换。 2,内层堆栈弹掉先前堆栈切换时复制进来的参数,再弹出指向外层堆栈的指针并载入ss:esp,至此,堆栈切换到外层堆栈。 3,外层堆栈弹掉先前压入的参数。 4,检查数据段寄存器ds,es,fs,gs,以保证各自对应的段在外层cpl等级下仍是可访问,若不可访问,则装入空选择子避免保护空洞。 阅读全文

posted @ 2012-09-01 21:41 weiweishuo 阅读(207) 评论(0) 推荐(0) 编辑

进入内层时的堆栈切换

摘要: 1,根据TSS,建立同切换后CPL相对应的内层堆栈。 2,将外层堆栈指针ss,esp依次压入内层堆栈。 3,从外层堆栈复制dcount个参数到内层堆栈。 4,将当前的cs,eip压入内层堆栈。 (实际上到这里已经完成了堆栈切换的相关工作) 5,加载调用门中指定的selector:offset到cs:eip,目标代码段开始执行。 阅读全文

posted @ 2012-09-01 21:32 weiweishuo 阅读(171) 评论(0) 推荐(0) 编辑

我对jmp selector:offset模型的理解

摘要: jmp selector:offset,其中的selector可能指示段描述符或门描述符,cpu执行该指令的流程应该是这样: 以上就是我对jmp selector:offset执行过程的理解,其实call selector:offset类似,仅仅是首尾多了cs,eip的堆栈,出栈。 (图示的箭头画的有些扎眼,希望没影响到你心情,我也没办法,flash cs里做的图,它又不带箭头工具,我只能自己画...) 阅读全文

posted @ 2012-09-01 15:57 weiweishuo 阅读(232) 评论(0) 推荐(0) 编辑

导航