长64位模式中远JMP和远CALL之间的差异

时间:2018-05-31 19:43:22

标签: assembly 64-bit x86-64 cpu-architecture opcode

我正在尝试理解x86-64 CPU的远JMP和远CALL指令之间的区别。如果我正在为64位长模式正确地遵循英特尔文档:

A) 远程调用(操作码48, FF, /3)或asm:

call tbyte ptr [rcx]

可用于对相同或不同代码段的“代码段”或“调用门”调用,具体取决于所使用的段选择器的GDT或LDT。其中:

  • “代码段”只能指定相同的权限(CPL)级别调用。它可以是对32位兼容模式代码的调用,也可以是相同的64位长模式(取决于L位)。

  • “呼叫门”可以指定相同的权限级别(CPL)呼叫或特权间呼叫。但它不能跳转到32位兼容模式,只能跳转到相同的64位长模式。

B)远JMP (操作码48, FF, /5)或asm:

jmp tbyte ptr [rcx] 

我找不到64位长模式的文档。这与远程CALL的规格几乎相同吗?

我似乎无法找到任何关于特权“调用门”JMP到不同CPL的引用,或者能够从长64位模式跳转到32位兼容模式。

有人可以澄清这一点。

1 个答案:

答案 0 :(得分:3)

通过调用门可以在64位中进行特权级间远程调用。目标调用门指定的代码段描述符必须是不符合的,并且其DPL必须小于CPL。然后将新的CPL设置为DPL。另一方面,远程跳转不可能进行特权级别控制传输。也就是说,如果由呼叫门指定的代码段描述符是不符合的并且DPL <1。 CPL,然后发生一般保护(GP)异常。

您不能将JMP转换为64位段的非64位段。否则,会发生GP。