据说SYSCALL指令是INT 0X80的64位版本,但是仍然可以在64位代码中使用后者(尽管strace由于我猜是64位ABI而将其解码错误),通常会通过“旧版条目”。但是有些我不太了解,为什么SYSCALL指令更快?

#1 楼

简短的答案是syscall的开销比int 0x80的开销小。

有关这种情况的更多详细信息,请参阅对Intel x86 vs x64系统调用的公认答案,其中提出了几乎相同的问题:


有人告诉我,syscall比生成软件中断更轻松,更快捷。为什么在x64上它比x86快,我可以使用int 80h在x64上进行系统调用吗?


另请参见:



Intel P6 vs P7系统调用性能


此电子邮件线程讨论了与int 0x80相关的开销导致的某些Intel CPU的观察到的速度下降




Linux 2.6中基于Sysenter的系统调用机制


发现该软件中断方法[int 0x80]在Pentium IV处理器上要慢得多。为解决此问题,Linus实现了一种替代的系统调用机制,以利用所有Pentium II +处理器提供的SYSENTER / SYSEXIT指令。



Linux内核,4.6 Sysenter和vsyscall页面(2003)


在某些任务上,发现2 GHz奔腾4比850 MHz奔腾III慢得多,并且这种缓慢是由奔腾4上传统int 0x80中断的开销很大。某些i386系列型号确实有更快的进入内核的方法。在奔腾II上有sysenter指令。 AMD也有syscall指令。