this post,我了解到


syscall是在x86-64上进入内核模式的默认方法。
实际上,最近的内核正在实现VDSO


然后我在http://man7.org/linux/man-pages/man2/syscall.2.html中查找手册:


  第一张表列出了用于过渡到内核的指令
         模式(这可能不是过渡到
         内核,因此您可能必须参考vdso(7)),该寄存器用于
         指示系统调用号码,用于返回sys‐的寄存器
         tem调用结果,以及用于指示错误的寄存器.....


但是我缺乏一些基本知识来理解这些陈述。

是VDSO(7)是syscall(2)的实现,还是syscall(2)将调用VDSO(7)来完成系统调用?

如果不正确,那么VDSO(7)和SYSCALL(2)之间是什么关系?

最佳答案

仔细阅读手册页syscalls(2)vdso(7)以及system callsVDSO上的wiki页。另请阅读operating system维基页面和Operating Systems: Three Easy Pieces(可免费下载)。

系统调用是基本的,它们是user-space应用程序与操作系统kernel进行交互并使用其提供的服务的唯一方式。因此,每个程序都使用一些系统调用(除非它崩溃并被某些signal(7)终止)。系统调用要求用户进行内核转换(例如通过SYSCALLSYSENTER机器instruction on x86),这在某种程度上是“昂贵的”(例如,可能需要一微秒的时间)。

VDSO只是一个聪明的优化(为避免真正系统调用的代价,对于clock_gettime(2)这样的功能,仍然很少作为真正的系统调用存在),有点像内核神奇地提供了一些没有任何实际文件的共享库。某些程序(例如静态链接的程序,或未使用libc的程序,例如BONES或可能是busybox)不使用它。

您可以避免VDSO(或不使用它),而早期的内核则没有。但是您无法避免进行系统调用,而程序通常会执行很多操作。

也可以使用strace(1)进行播放,以了解由应用程序或正在运行的进程完成的(许多)系统调用。

10-05 18:08