首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在80X86中EIP寄存器何时等于CR2?

在80X86中EIP寄存器何时等于CR2?
EN

Stack Overflow用户
提问于 2022-10-28 15:47:43
回答 1查看 41关注 0票数 0

如果CPU获取指令,EIP == CR2是否有可能?

我只是好奇,但经过多次搜索,似乎没有人关心它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-28 16:10:57

一个页面错误将CR2设置为页面错误线性地址,但它将其值保存到下一个页面错误。

在解决页面错误并将页面错误处理程序返回到用户空间后,它将重新运行故障处理指令。发生这种情况的正常方式是通过一个iret将CS:EIP设置为异常返回地址。

如果页面故障发生在代码提取上,并且有一个平面内存模型(CS =0,所以EIP =线性地址),那么CR2 =错误指令的地址,这也是#PF异常推送的异常返回地址。

一个令人困惑的因素是,在执行指令期间,EIP是当前指令末尾的地址。(相对跳转和[rip + rel32]寻址模式相对于指令结束。)但是,如果您考虑到指令之间的逻辑状态,比如在iret设置新的CS:EIP之后,但是在指令的fetch+decode再次更改EIP之前,您可以在正常操作期间拥有EIP = CR2,而不必执行mov cr2, eax,这当然可以创建任何您想要的条件。

当然,这只是执行的逻辑模型,一次运行一个指令,按程序顺序运行。也许像386这样的非流水线CPU实际上可能有这样的物理状态,但是现代的超标量无序的exec CPU只会保持运行的错觉,就好像它们已经这样做了。

假设你有一个内存布局

代码语言:javascript
复制
  0x401234   jmp foo
  ...
  0x402000   foo:  nop         # in an page that's not mapped yet

一个可能的执行顺序可以是:

  • CR2=未知,EIP = 0x401234 jmp foo
  • CR2= handler,EIP = 0x402000 (未映射页)
  • CR2= 0x402000,EIP = #PF处理程序顶部(从IDT条目加载)
  • 页面错误处理程序将页面连接到HW页表中;假设它已经在内存中某个地方,或者在等待I/O或从zram iret
  • CR2=
  • CR2= 0x402000解压缩后,EIP = #PF处理程序的结束、EIP 0x402000、EIP = 0x402000之后、开始执行nop
  • CR2= 0x402000、EIP= 0x402001、在nop执行期间和执行之后的任何东西之前。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74237809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档