vdso共享库(linux-vdso.so)是包含内核对象代码(系统调用)的库吗?


4

我注意到我编译到gcc的所有程序都链接到vdso库。这个库是否包含对内核的系统调用(如mmap()和fork()以及其他系统调用)的库?

我知道系统调用不是GNU C标准库的功能,因此它们的目标代码必须位于在编译时与应用程序链接的某个库中吗?

那么vdso是那个库吗?


可能是。您要解决什么问题?
库萨兰达

1
@Kusalananda我没有任何问题。我试图了解有关C编译器如何工作以及链接器如何工作的更多信息,并从根本上成为一名更好的程序员和计算机科学家。
yoyo_fun

Answers:


8

系统调用在内核中实现,如后续问题的答案所述。虚拟动态共享对象vDSO是一个小的虚拟库,由内核实现,内核将其映射到所有进程。像syscalls一样,它由C库包装。

syscall和vDSO之间的主要区别是特权之一。系统调用在内核空间中执行,并且在用户空间和内核空间之间切换非常昂贵。作为优化,在用户空间中运行的vDSO中提供了一些实际上不需要在内核空间中运行的系统调用。一个例子gettimeofday经常被调用,并且可以由内核实现而无需切换到内核空间。

该手册vdso页有更多详细信息。有关一般在Linux上包括vDSO的系统调用的详细讨论,请参见系统调用 第1 部分第2 部分的剖析


很好的答案!整个vDSO概念是在cirka 2.6时引入内核的。较旧的(=较早的)内核版本不是这样做的。
Per Lundberg

1
单击有前途的第一个Google链接后来
earcam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.