SYSCALL / SYSRET指令如何跨x86 CPU执行?

时间:2013-08-07 23:23:57

标签: performance x86 kernel system-calls

SYSCALLSYSRET(以及他们仅限32位的英特尔同行SYSENTERSYSEXIT)通常被描述为“通常更快”的进入和退出方式x86处理器中的管理员模式比调用门或软件中断,但这个声明的确切数字仍然基本没有记录。特别是,我能够找到的所有英特尔或AMD优化指南都没有提及这些指令。所以:

  • 最近的英特尔64微架构中,SYSCALLSYSRET需要多少个周期(估计值)?这可能是通过直接实验来衡量的,但是有很多不同的CPU需要测试。

根据此数字的数量级,更详细的问题可能是相关的:

  • 他们是否会产生一个完整的管道摊位或任何其他类型的摊位?
  • 如果有的话,它们如何与分支预测(例如返回堆栈缓冲区)和提取逻辑交互?
  • 延迟,数据依赖,序列化怎么样?
  • &安培; TC

假设用户空间一侧有64位代码,没有额外的地址空间切换(写入CR3),甚至匹配SYSCALLSYSRET对,如果重要的话。

1 个答案:

答案 0 :(得分:2)

我也很好奇,所以我写了一些基本的裸机代码来对它进行基准测试:只是一个循环调用 syscall 1000000 次的循环,系统调用处理程序只运行 sysret 而没有别的。在我的 Ryzen 7 3700X 上,调用 + 返回平均为 78 个周期。

显然,这是一个人为的基准测试,因为一个真正的系统调用处理程序可能需要做一些事情,比如切换堆栈和执行 Spectre 缓解。但它给出了数量级的概念,小于缓存未命中。