【发布时间】:2018-02-21 18:34:06
【问题描述】:
在支持syscall 和sysret 的 x86-64 Intel 系统上,在 vanilla 内核上从 64 位用户代码中“最快”的系统调用是什么?
特别是,它必须是一个执行syscall/sysret用户内核转换1的系统调用,但除此之外所做的工作量最少。它甚至不需要自己执行系统调用:某种类型的早期错误永远不会分派到内核端的特定调用,只要它不会因此而走慢路。
此类调用可用于估算原始 syscall 和 sysret 开销,而与调用完成的任何工作无关。
1 特别是,这不包括看似系统调用但在 VDSO 中实现(例如,clock_gettime)或由运行时缓存(例如,getpid)的事物。
【问题讨论】:
-
你为什么要问,你为什么关心?你的问题缺乏动力!
-
你为什么关心我为什么关心?就我个人而言,我不坚持任何问题都需要有详细动机的想法,只要它足够清楚 - 这是 SO 的一个令人讨厌的方面,一个特定的子组几乎用“你为什么要关心?XY 问题”来回答每个问题, ETC”。无论如何,尽管我对这件事有感觉,但我什至预先考虑了动机,因为我认为有人会问:这样的调用可用于估计原始 sysenter 和 sysret 开销,而与调用所做的任何工作无关。
-
您是否排除了开发人员创建并添加到内核中的无操作系统调用的可能性?
-
我看到您在评论中回复了关于未修改内核的评论。这确实应该在问题中得到体现。
-
@MichaelPetch - 是的,它应该是现代内核上最快的现有调用。无论如何,我怀疑无操作调用并不是最快的:最快的可能只是一个错误路径,例如,“系统调用编号太高”,它甚至永远不会离开入口代码。公平地说,我认为这暗示着“添加你自己的系统调用”应该被隐含地排除在 Linux 问题上,除非另有说明。否则,任何“我如何或可以在 Linux 上做 X”都可以简单地通过“添加您自己的系统调用来做”来回答(然后尝试说服每个人使用您的自定义内核?)。
标签: linux performance x86-64 microbenchmark