x86-64和远程呼叫/跳转

时间:2010-07-02 17:49:05

标签: assembly x86 x86-64 memory-segmentation

快速摘要:在x86-64模式下,远程跳转速度与x86-32模式一样慢?

在x86处理器上,跳转分为三种类型:

  • 短,PC偏移量为+/- 127字节(2字节指令)
  • 附近,带有+/- 32k偏移,“绕过”当前段(3字节指令)
  • far,可以跳转到任何地方(5字节指令)

短跳和近跳需要1-2个时钟周期,而远跳需要50-80个时钟周期,具体取决于处理器。从我对文档的阅读来看,这是因为它们“在CS之外,当前的代码段。”

在x86-64模式下,不使用代码段 - 该段实际上始终为0..infinity。因此,走出某个细分市场不应该受到惩罚。

因此,问题是:如果处理器处于x86-64模式,则跳转的时钟周期数是否会发生变化?

相关红利问题:大多数以32位保护模式运行的类似* nix的操作系统明确地将段大小设置为0..infinity并管理线性 - >物理翻译完全通过页面表。他们是否从远程调用的时间(更少的时钟周期)中获益,或者自8086以来,大小段寄存器的内部CPU遗留是否真的受到了损失?

1 个答案:

答案 0 :(得分:1)

CS不仅用于base和limit,还用于权限。 CPL在那里被编码,以及其他字段,例如:

  • D位 - 32位或16位默认段大小
  • L位 - 为段选择兼容性或64位模式(在这种情况下,基数和限制很重要)

远程跳跃也可以通过任务门,远程呼叫也可以通过呼叫门。无论64位模式如何,都必须处理所有这些。

总而言之,64位模式的远程跳跃并不比32位模式快。实际上,考虑到启用64位模式时,段描述符的大小是禁用64位模式时的两倍,所有描述符表访问都加倍,这可能会延长跳转时间。