18

SYSCALLSYSRET(以及它们的仅 32 位英特尔对应物SYSENTERSYSEXIT)通常被描述为在 x86 处理器中进入和退出管理模式的“通常更快”的方式,而不是调用门或软件中断,但这种说法背后的确切数字在很大程度上仍然没有记录。特别是,我能找到的所有 Intel 或 AMD 优化指南都没有提到这些指令。所以:

  • 最近的 Intel 64 微架构执行SYSCALL和执行多少个周期(估计) ?SYSRET这可能可以通过直接实验来测量,但是有很多不同的 CPU 需要测试。

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

  • 它们是否会导致完整的管道停顿或任何其他类型的停顿?
  • 如果有的话,它们如何与分支预测(例如返回堆栈缓冲区)和获取逻辑进行交互?
  • 延迟、数据依赖、序列化呢?
  • 等等。

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

4

1 回答 1

3

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

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

于 2021-01-02T09:30:31.633 回答