【发布时间】:2012-04-27 22:22:18
【问题描述】:
英特尔手册中关于规范地址和一般保护异常的内容如下:
来自(第 1 卷,第 3-13 页):
“如果线性内存引用不是规范形式,则实现应该生成异常。在大多数情况下,会生成通用保护异常 (#GP)。...”
来自(第 3A 卷,第 6-52 页):
“以下情况会导致 64 位模式下的一般保护异常:
- 如果内存地址是非规范形式。
- 如果段描述符内存地址是非规范形式。 ...”
我很想知道 RIP 的内容是否也被归类为 “内存地址”,如上面引用中所述。还是 RIP 可以包含非规范地址但在 RIP 用于引用内存中的位置之前不会引发#GP?
[编辑]
我现在更仔细地阅读了手册,尤其是 CALL、RET 和 JMP 指令的伪代码(因为它们可以随意更改 RIP)。我注意到在 64 位模式下,地址的规范性检查是在将其存储到 RIP 之前完成的,因此在 RIP 获得非规范地址之前会引发#GP。所以,我的问题的答案是 RIP 永远不能包含非规范地址。
我担心的情况 --- 将引发 #GP 因为包含非规范地址的 RIP 用于引用内存位置 --- 根本没有出现。
【问题讨论】:
-
当然,当处理器无法读取 RIP 地址处的机器指令时,什么都不会发生。
-
是的,当然。但是,目前我并不担心处理器无法读取 RIP 引用的地址处的指令。 RIP 本身的内容 和相关的异常是我现在关心的问题。
标签: memory x86 x86-64 intel virtual-address-space