我正在尝试理解x86-64CPU的far JMP和far CALL指令的区别。如果我按照64位长模式的英特尔文档进行了正确操作:
操作码A) Far CALL (操作码48, FF, /3
)或在asm中:
call tbyte ptr [rcx]
可用于对相同或不同代码段的“代码段”或“调用门”调用,具体取决于所使用的段选择器的GDT或LDT。其中:
B)远JMP (操作码48, FF, /5
)或在asm中:
jmp tbyte ptr [rcx]
我找不到很多关于64位长模式的文档。它和远距离呼叫的规格是一样的吗?
我似乎找不到任何关于特权间“调用门”JMP到不同CPL的引用,或者能够从长64位模式跳转到32位兼容模式。
有人能澄清这一点吗。
发布于 2018-06-01 04:58:19
通过调用门,可以在64位中实现特权级别间的远程调用。目标调用门指定的代码段描述符必须不一致,并且其DPL必须小于CPL。则将新的CPL设置为DPL。另一方面,特权级别间的控制转移是不可能进行远跳跃的。也就是说,如果调用门指定的代码段描述符不一致,并且DPL < CPL,则会发生通用保护(GP)异常。
您不能从64位段JMP到非64位段。否则,将发生GP。
https://stackoverflow.com/questions/50631680
复制相似问题