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