2

英特尔手册对规范地址和一般保护异常进行了以下说明:

来自(第 1 卷,第 3-13 页):

“如果线性内存引用不是规范形式,则实现应该生成异常。在大多数情况下,会生成通用保护异常 (#GP)。...”

来自(第 3A 卷,第 6-52 页):

“以下情况会导致 64 位模式下的一般保护异常:
- 如果内存地址采用非规范形式。
- 如果段描述符内存地址采用非规范形式......”

我很想知道 RIP 的内容是否也被归类为“内存地址”,如上面引用中所述。还是 RIP 可以包含非规范地址但在 RIP 用于引用内存中的位置之前不会引发#GP?

[编辑]

我现在更仔细地阅读手册,尤其是 CALL、RET 和 JMP 指令的伪代码(因为它们可以随意更改 RIP)。我注意到在 64 位模式下,地址的规范性检查是在它存储到 RIP 之前完成的,因此在 RIP 获得非规范地址之前会引发#GP。所以,我的问题的答案是 RIP 永远不能包含非规范地址。

我担心的情况 --- 因为包含非规范地址的 RIP 用于引用内存位置而引发#GP --- 根本不会出现。

4

2 回答 2

1

RIP 还必须包含规范地址,而不仅仅是访问内存时的 RSP 或 RBX。

编辑:您可以看到 RIP 没有被排除在以下要求之外:

  • SYSENTER/SYSEXIT 和 SYSCALL/SYSRET 的描述
  • “中断 13 - 一般保护异常 (#GP)”部分:If the target offset in a destination operand of a call or jmp is in a non-canonical form.
于 2012-04-27T23:49:03.787 回答
0

会有什么不同?如果您尝试通过跳转或调用指令设置 RIP,处理器尝试加载该地址并进行陷阱。是否将陷阱指定为在寄存器集中或​​从 icache 加载是否重要?

于 2012-04-28T04:32:57.513 回答