一尘不染

最快的Linux系统调用

linux

上X86-64英特尔系统,支持syscallsysret什么是从64位用户代码“最快”的系统调用在香草内核?

特别是,它必须是一个执行syscall/ sysretuser
<->内核转换1的系统调用,但执行的工作量最少。它甚至不需要执行syscall本身:某种从不分派给内核侧特定调用的早期错误是可以的,只要它不会因此而走慢。

这样的调用可用于估计原始syscallsysret开销,而与调用完成的任何工作无关。


1特别是,这不包括看似系统调用但在VDSO中实现(例如clock_gettime)或由运行时缓存(例如)的事物getpid


阅读 341

收藏
2020-06-07

共1个答案

一尘不染

不存在的一个,因此快速返回-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:
2020-06-07