上X86-64英特尔系统,支持syscall和sysret什么是从64位用户代码“最快”的系统调用在香草内核?
syscall
sysret
特别是,它必须是一个执行syscall/ sysretuser <->内核转换1的系统调用,但执行的工作量最少。它甚至不需要执行syscall本身:某种从不分派给内核侧特定调用的早期错误是可以的,只要它不会因此而走慢。
这样的调用可用于估计原始syscall和sysret开销,而与调用完成的任何工作无关。
1特别是,这不包括看似系统调用但在VDSO中实现(例如clock_gettime)或由运行时缓存(例如)的事物getpid。
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: