SYSCALL
和SYSRET
(以及他们仅限32位的英特尔同行SYSENTER
和SYSEXIT
)通常被描述为“通常更快”的进入和退出方式x86处理器中的管理员模式比调用门或软件中断,但这个声明的确切数字仍然基本没有记录。特别是,我能够找到的所有英特尔或AMD优化指南都没有提及这些指令。所以:
SYSCALL
和SYSRET
需要多少个周期(估计值)?这可能是通过直接实验来衡量的,但是有很多不同的CPU需要测试。根据此数字的数量级,更详细的问题可能是相关的:
假设用户空间一侧有64位代码,没有额外的地址空间切换(写入CR3),甚至匹配SYSCALL
和SYSRET
对,如果重要的话。
答案 0 :(得分:2)
我也很好奇,所以我写了一些基本的裸机代码来对它进行基准测试:只是一个循环调用 syscall 1000000 次的循环,系统调用处理程序只运行 sysret 而没有别的。在我的 Ryzen 7 3700X 上,调用 + 返回平均为 78 个周期。
显然,这是一个人为的基准测试,因为一个真正的系统调用处理程序可能需要做一些事情,比如切换堆栈和执行 Spectre 缓解。但它给出了数量级的概念,小于缓存未命中。