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。其中:
"Code segment" 只能指定相同权限(CPL)级别的调用。可以是调用32位兼容模式代码,也可以是调用同样的64位长模式(取决于L位。)
"Call gate" 可以指定相同权限级别 (CPL) 调用或权限间调用。但是不能跳转到32位兼容模式,只能跳转到同样的64位长模式。
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。
我正在尝试了解 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。其中:
"Code segment" 只能指定相同权限(CPL)级别的调用。可以是调用32位兼容模式代码,也可以是调用同样的64位长模式(取决于L位。)
"Call gate" 可以指定相同权限级别 (CPL) 调用或权限间调用。但是不能跳转到32位兼容模式,只能跳转到同样的64位长模式。
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。