Memory 非规范线性地址和一般保护异常

Memory 非规范线性地址和一般保护异常,memory,x86,x86-64,intel,virtual-address-space,Memory,X86,X86 64,Intel,Virtual Address Space,英特尔手册对规范地址和一般保护异常进行了如下说明: 摘自(第1卷,第3-13页): “如果线性内存引用不是标准形式,则实现应生成异常。在大多数情况下,会生成一般保护异常(#GP)。” 摘自(第3A卷,第6-52页): “以下情况会导致64位模式下的一般保护异常: -如果内存地址为非规范形式。-如果段描述符内存地址为非规范形式….” 我很想知道RIP的内容是否也被归类为“内存地址”,正如上面引用的那样。或者,RIP可以包含非规范地址,但在RIP用于引用内存中的某个位置之前,不会引发#GP [编辑]

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

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

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

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

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

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

[编辑]

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


我所担心的情况——GP将被提出,因为包含非规范地址的RIP用于引用内存位置——根本不会出现。

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

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

  • SYSENTER/SYSEXIT和SYSCALL/SYSRET的说明
  • “中断13一般保护异常(#GP)”部分:
    如果调用或jmp的目标操作数中的目标偏移量为非规范形式。

    • 有什么区别?如果您试图通过跳转或调用指令设置RIP,处理器将尝试加载该地址和陷阱。陷阱是否被指定在寄存器集上或从icache加载有关系吗?

      当然,当处理器无法读取RIP地址的机器指令时,不会发生任何事情。是的,肯定会发生。然而,目前我并不担心处理器无法读取RIP所指地址处的指令。RIP本身的内容和相关的例外是我现在关心的问题。谢谢你的回答。我对问题进行了编辑,以包括在阅读您的答复后发现的内容。我需要知道异常的确切来源。原因是我试图正式指定x86-64处理器的某些部分以及类似这些细节。依赖这种区别似乎很危险。请记住,这是AMD的规格,这是原来的架构。在我看来,一个实现可以合法地实现一个小于64位的RIP,它需要规范地址,或者一个全宽度寄存器,它在加载时被捕获。谢谢你的评论。我完全同意你的观点(顺便说一句:AMD手册比Intel手册可读性好得多!语言很好,表格和图形的格式和加载有助于更快理解)。回到主要主题——我的部分目标是使正式规范变得如此“健壮”,以使它们能够像规范地址一样表示想法,而不必过多地考虑它们的实现,只要能够证明实现满足这些想法。为此,我先研究实现,然后才能为它们想出“抽象”。