VDSO(7)和SYSCALL(2)之间的关系是什么?

时间:2018-05-05 04:23:57

标签: c operating-system kernel system-calls

this post开始,我学会了

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

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

  

第一个表列出了用于转换到内核的指令          模式(可能不是过渡到最快或最好的方式          内核,所以你可能要参考vdso(7)),这个寄存器用来          表示系统调用号,用于返回系统的寄存器          tem调用结果,以及用于发出错误信号的寄存器.....

但我缺乏理解这些陈述的基本知识。

VDSO(7) syscall(2)的实现,或者 syscall(2)是否会调用 > VDSO(7)完成系统调用

如果不是这样, VDSO(7) SYSCALL(2)之间的关系是什么?

2 个答案:

答案 0 :(得分:2)

VDSO(7)不是syscall(2)的实现。 如果没有VDSO(7),系统调用将在用户空间应用程序中运行。在这种情况下将发生上下文切换。 如果使用VDSO(7),将运行syscall而不进行上下文切换。 内核使用vDSO自动映射到所有用户空间应用程序的地址空间。

答案 1 :(得分:1)

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

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

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

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

还可以使用strace(1)来了解应用程序或正在运行的进程所完成的(许多)系统调用。