我正在尝试理解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位兼容模式。
有人可以澄清这一点。
答案 0 :(得分:3)
通过调用门可以在64位中进行特权级间远程调用。目标调用门指定的代码段描述符必须是不符合的,并且其DPL必须小于CPL。然后将新的CPL设置为DPL。另一方面,远程跳转不可能进行特权级别控制传输。也就是说,如果由呼叫门指定的代码段描述符是不符合的并且DPL <1。 CPL,然后发生一般保护(GP)异常。
您不能将JMP转换为64位段的非64位段。否则,会发生GP。