我注意到我所有编译到gcc的程序都链接到vdso库。这是包含对内核的系统调用的库吗,比如mmap()和fork()以及其他系统调用?
我知道系统调用不是GNU C标准库的函数,所以它们的对象代码必须在编译时与应用程序链接的库中?
那么vdso是那个图书馆吗?
发布于 2017-10-09 12:48:52
系统调用是在内核中实现的,正如你的后续问题的答案中提到的那样。vDSO (虚拟动态共享对象)是一个小型的虚拟库,也是由内核实现的,内核映射到所有进程中。就像syscalls一样,它由C库包装。
系统和vDSO之间的主要区别是特权。系统调用在内核空间中执行,用户空间和内核空间之间的切换开销很大。作为优化,在运行在用户空间的vDSO中提供了一些实际上不需要在内核空间中运行的系统调用。一个例子是gettimeofday,它常常被调用,并且可以由内核实现,而不需要切换到内核空间。
gettimeofday
vdso手册有更多细节。有关Linux上的系统调用(包括vDSO )的详细讨论,请参阅系统调用第1部分和第2部分的剖析。
vdso
https://unix.stackexchange.com/questions/396987
相似问题