快速总结:在 x86-64 模式下,远跳是否与 x86-32 模式下一样慢?
在 x86 处理器上,跳转分为三种类型:
短跳转和近跳转需要 1-2 个时钟周期,而远跳转需要 50-80 个时钟周期,具体取决于处理器。从我对文档的阅读来看,这是因为它们“超出了当前代码段 CS 之外。”
在 x86-64 模式下,不使用代码段 - 该段实际上始终为 0..无穷大。因此,超出某个部分不应该受到惩罚。
因此,问题是:如果处理器处于 x86-64 模式,时钟周期数是否会因远跳而改变?
相关奖励问题:大多数在 32 位保护模式下运行的类似 *nix 的操作系统显式地将段大小设置为 0..infinity,并完全通过页表管理线性 -> 物理转换。他们是否从远调用时间(更少的时钟周期)中受益,或者惩罚实际上是自 8086 以来大小段寄存器的内部 CPU 遗留问题?
CS不仅用于基础和限制,还用于权限。 CPL 以及其他字段都在那里编码:
远跳也可以通过任务门,远调用也可以通过调用门。无论 64 位模式如何,所有这些都必须处理。
总而言之,64 位模式下的远跳转并不比 32 位模式下快。事实上,考虑到启用 64 位模式时,段描述符是禁用 64 位模式时的两倍,所有描述符表访问都会加倍,这可能会延长跳转时间。