[英]What's the relationship between VDSO(7) and SYSCALL(2)?
从这篇文章中 ,我了解到
syscall
是在x86-64
上进入内核模式的默认方法。 然后,我在http://man7.org/linux/man-pages/man2/syscall.2.html中查找了手册:
第一张表列出了用于过渡到内核模式的指令(这可能不是过渡到内核的最快或最佳方法,因此您可能必须参考vdso(7)),该寄存器用于指示系统调用号,用于返回系统调用结果的寄存器,以及用于指示错误的寄存器。
但是我缺乏一些基本知识来理解这些陈述。
是VDSO(7)是syscall(2)的实现,还是syscall(2)将调用VDSO(7)完成系统调用 ?
如果不正确,那么VDSO(7)和SYSCALL(2)之间是什么关系?
VDSO(7)不是syscall(2)的实现。 没有VDSO(7),系统调用将在用户空间应用程序中运行。 在这种情况下将发生上下文切换。 如果使用VDSO(7),将在不进行上下文切换的情况下运行syscall。 内核通过vDSO自动映射到所有用户空间应用程序的地址空间。
仔细阅读手册syscalls(2) , vdso(7)以及有关系统调用和VDSO的wiki页。 另请阅读操作系统 Wikipage和操作系统:三个简单的部分 (可免费下载)。
系统调用是基本的,它们是用户空间应用程序可以与操作系统内核进行交互并使用其提供的服务的唯一方法。 因此,每个程序都使用一些系统调用(除非它崩溃并被一些signal(7)终止)。 系统调用要求用户进行内核转换(例如,通过x86上的SYSCALL
或SYSENTER
机器指令 ),这在某种程度上是“昂贵的”(例如,可能需要一微秒)。
VDSO只是一个聪明的优化(为避免真正系统调用的成本,因为Clock_gettime(2)等很少的函数仍然作为真正系统调用存在),有点像内核神奇地提供了一些共享库,而没有任何真正的文件。 某些程序(例如,静态链接的程序,或未使用libc
例如BONES或busybox )不使用它。
您可以避免VDSO(或不使用它),并且早期的内核没有它。 但是您无法避免进行系统调用,而程序通常会执行很多操作。
还可以与strace(1)一起玩,以了解由应用程序或正在运行的进程完成的(许多)系统调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.