long 64位模式下far JMP和far CALL的区别

Difference between far JMP and far CALL in a long 64-bit mode

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

A) Far CALL(操作码48, FF, /3)或asm:

call tbyte ptr [rcx]

可用于对相同或不同代码段的 "code segment" 或 "call gate" 调用,具体取决于所使用的段选择器的 GDT 或 LDT。其中:

B) Far JMP(操作码48, FF, /5)或在 asm 中:

jmp tbyte ptr [rcx] 

我找不到很多关于 64 位长模式的文档。它与远程呼叫的规格几乎相同吗?

我似乎找不到任何有关跨权限 "call gate" JMP 到不同 CPL 或能够从长 64 位模式跳转到 32 位兼容模式的参考。

谁能澄清一下。

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

您不能从 64 位段跳转到非 64 位段。否则,发生 GP。