如果CPU获取指令,EIP == CR2是否有可能?
我只是好奇,但经过多次搜索,似乎没有人关心它。
发布于 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只会保持运行的错觉,就好像它们已经这样做了。
假设你有一个内存布局
0x401234 jmp foo
...
0x402000 foo: nop # in an page that's not mapped yet一个可能的执行顺序可以是:
jmp foo,iretnopnop执行期间和执行之后的任何东西之前。https://stackoverflow.com/questions/74237809
复制相似问题