【发布时间】:2011-03-11 05:22:53
【问题描述】:
快速总结:在 x86-64 模式下,远跳是否与 x86-32 模式下一样慢?
在 x86 处理器上,跳转分为三种类型:
- 短,PC 偏移量为 +/-127 字节(2 字节指令)
- near,具有 +/- 32k 偏移量,“滚动”当前段(3 字节指令)
- far,可以任意跳转(5字节指令)
短跳转和近跳转需要 1-2 个时钟周期,而远跳转需要 50-80 个时钟周期,具体取决于处理器。根据我对文档的阅读,这是因为它们“超出了 CS,即当前代码段”。
在 x86-64 模式下,不使用代码段 - 该段实际上始终为 0..infinity。因此,超出部分不应该受到惩罚。
因此,问题是:如果处理器处于 x86-64 模式,时钟周期数是否会因远跳而改变?
相关的额外问题:大多数在 32 位保护模式下运行的类似 *nix 的操作系统明确地将段大小设置为 0..infinity 并完全通过页表管理线性 -> 物理转换。他们是否从远程调用时间(更少的时钟周期)方面受益,或者惩罚真的是自 8086 以来大小段寄存器的内部 CPU 遗留问题?
【问题讨论】:
-
您对 *nix 系统的评论也适用于 Windows,AFAIK。我不认为有任何真正使用代码段的现代操作系统。
标签: assembly x86 x86-64 memory-segmentation