【问题标题】:Non-canonical linear addresses and general protection exception非规范线性地址和一般保护异常
【发布时间】: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


【解决方案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.

【讨论】:

  • 感谢您的回答。我编辑了这个问题,以包含我在阅读您的回复后发现的内容。
【解决方案2】:

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

【讨论】:

  • 我需要知道异常的确切来源。原因是我正试图正式指定 x86-64 处理器的某些部分以及这些细节。
  • 依赖这种区分似乎很危险。请记住,该架构的原始规格是 AMD 规格。在我看来,一个实现可以合法地实现或者一个小于 64 位的需要规范地址的 RIP或者一个加载时被捕获的全宽寄存器。
  • 感谢您的评论。我完全同意你的看法(顺便说一句,AMD 手册比 Intel 的手册可读性好得多!语言很好,表格和图形的格式和负载也有助于更快地理解)。回到主要话题 --- 我的部分目标是使正式规范如此“健壮”,以至于它们代表规范地址之类的想法,而无需过多关注其实现,只要可以证明实现满足这些想法。为此,我先研究实现,然后才能为它们想出“抽象”。
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2010-11-01
  • 2013-11-03
  • 2014-02-15
  • 2018-01-24
相关资源
最近更新 更多