linux - 最快的 Linux 系统调用

标签 linux performance x86-64 microbenchmark

在支持 syscallsysret 的 x86-64 Intel 系统上,从 vanilla 内核上的 64 位用户代码进行的“最快”系统调用是什么?

特别是,它必须是执行syscall/sysret user <-> kernel transition1 的系统调用,但是执行除此之外的最少工作量。它甚至不需要自己执行系统调用:某种类型的早期错误从不分派(dispatch)到内核端的特定调用是可以的,只要它不会因此而走上慢路径。

这样的调用可用于估计原始 syscallsysret 开销,独立于调用完成的任何工作。


1 特别是,这排除了看似系统调用但在 VDSO 中实现(例如,clock_gettime)或由运行时缓存(例如, getpid).

最佳答案

一个不存在的,因此很快返回 -ENOSYS。

来自 arch/x86/entry/entry_64.S:

#if __SYSCALL_MASK == ~0
    cmpq    $__NR_syscall_max, %rax
#else
    andl    $__SYSCALL_MASK, %eax
    cmpl    $__NR_syscall_max, %eax
#endif
    ja  1f              /* return -ENOSYS (already in pt_regs->ax) */
    movq    %r10, %rcx

    /*
     * This call instruction is handled specially in stub_ptregs_64.
     * It might end up jumping to the slow path.  If it jumps, RAX
     * and all argument registers are clobbered.
     */
#ifdef CONFIG_RETPOLINE
    movq    sys_call_table(, %rax, 8), %rax
    call    __x86_indirect_thunk_rax
#else
    call    *sys_call_table(, %rax, 8)
#endif
.Lentry_SYSCALL_64_after_fastpath_call:

    movq    %rax, RAX(%rsp)
1:

关于linux - 最快的 Linux 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913091/

相关文章:

performance - 网站优化/减少asp.net mvc 3中的加载时间

PHPExcel 读取速度太慢

assembly - 用于 C 语言的完整 x86/x64 JIT 汇编程序

linux - 从多个文件中复制一行并粘贴为新文件中的列

java - 正确的时钟以提高 Java 的准确性

performance - 某些通用寄存器是否比其他寄存器更快?

c - 程序集中的 Printf 调用在输出期间未将 IEEE-754 浮点值格式化为十六进制

c - 为什么即使ASLR开启,__ libc_start_main的地址在GDB中也总是相同?

c++ - 在 Linux 中使用 C/C++ 强制 tcp/ip 跟踪路由经过特定跃点

linux - Shell脚本在特定修改日期之后查找文件并按修改日期的顺序对它们进行排序