我注意到我所有编译到 gcc 的程序都链接到 vdso 库。这是包含对内核的系统调用的库,例如 mmap() 和 fork() 以及其他系统调用吗?
我知道系统调用不是 GNU C 标准库的函数,因此它们的目标代码必须位于编译时与应用程序链接的某个库中?
那么vdso就是那个库吗?
答案1
系统调用是在内核中实现的,如答案中所述你的后续问题。 vDSO,即虚拟动态共享对象,是一个小型虚拟库,还由内核实现,内核将其映射到所有进程。与系统调用一样,它由 C 库包装。
系统调用和 vDSO 之间的主要区别之一是特权。系统调用在内核空间中执行,用户空间和内核空间之间的切换代价高昂。作为一种优化,vDSO 中提供了一些实际上不需要在内核空间中运行的系统调用,而 vDSO 在用户空间中运行。一个例子是gettimeofday
,它往往被频繁调用,并且可以由内核实现,而无需切换到内核空间。
这vdso
联机帮助页有更多详细信息。有关 Linux 上一般系统调用(包括 vDSO)的详细讨论,请参阅系统调用剖析 第1部分和第2部分。