从this post开始,我学会了
syscall
是在x86-64
上进入内核模式的默认方式。 然后我在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)之间的关系是什么?
答案 0 :(得分:2)
VDSO(7)不是syscall(2)的实现。 如果没有VDSO(7),系统调用将在用户空间应用程序中运行。在这种情况下将发生上下文切换。 如果使用VDSO(7),将运行syscall而不进行上下文切换。 内核使用vDSO自动映射到所有用户空间应用程序的地址空间。
答案 1 :(得分:1)
仔细阅读手册页syscalls(2),vdso(7)以及system calls和VDSO上的wikipages。另请阅读operating system wikipage和Operating Systems: Three Easy Pieces(可免费下载)。
系统调用是基础,它们只是 方式user-space应用程序可以与操作系统kernel交互并使用它提供的服务。所以每个程序都使用一些系统调用(除非它崩溃并被某些signal(7)终止)。系统调用需要用户进行内核转换(例如通过SYSCALL
或SYSENTER
机器instruction on x86),这在某种程度上是代价高昂的" (例如可能需要一微秒)。
VDSO只是一个聪明的优化(为了避免真正的系统调用的成本,对于像clock_gettime(2)这样的很少的函数,它们仍然作为真正的系统调用存在),有点像一些神奇地提供的共享库。没有任何真实文件的内核。某些程序(例如静态链接的程序,或未使用libc
的程序,如BONES或可能busybox)不会使用它。
您可以避免VDSO(或不使用它),而早期的内核没有它。但你无法避免进行系统调用,程序通常会做很多事情。
还可以使用strace(1)来了解应用程序或正在运行的进程所完成的(许多)系统调用。