vDSO 背后的原因
vDSO手册页对创建此特殊库的原因进行了说明:
为什么 vDSO 存在?内核提供了一些系统调用,最终用户空间代码经常使用,以至于这些调用可以支配整体性能。这是由于调用的频率以及退出用户空间和进入内核导致的上下文切换开销。
进一步阅读将告诉您用于在内核和用户空间之间共享数据的各种策略。尤其:
这些信息也不是秘密——任何特权模式下的任何应用程序(root 或任何非特权用户)都会得到相同的答案。
注意:强调我的。
这告诉我们,通过该 vDSO 接口提供的数据必须是公开的,系统上运行的任何进程无论如何都可以访问这些数据。这显然非常重要。
因此,回顾一下,我们有两个原因/限制来向 vDSO 添加功能:
- 功能必须提供非机密信息
- 这些功能必须使用太多以至于真的值得转移到 vDSO
可用功能
如果您进一步查看 vDSO 手册页,您会注意到各种实现支持的功能列表(请参阅 * ARCHITECTURE-SPECIFIC NOTES部分)。这为我们提供了另一条信息:实现/可访问某某时的 Linux 版本。第一个可用的实现是在 Linux 2.5 中(2001 年末,还要注意那是一个开发版本,所以第一个用户可用的版本是 2003 年的 2.6.1)。
我们在 vDSO 中找到了以下函数:
sigreturn
rt_sigreturn
sigtramp
sigtramp32
sigtramp_rt32
sigtramp_rt64
syscall_via_break
syscall_via_epc
vsyscall
get_syscall_map
lws_entry
linux_gateway_entry
gettimeofday
clock_gettime
clock_gettime64
clock_getres
time
getcpu
get_tbfreq
sync_dicache
sync_dicache_p5
flush_icache
getpid
getppid
set_tid_address
set_thread_pointer
datapage_offset
所以总的来说,我们看到呼吁:
对于 x86 处理器,它主要限于时间和 CPU。在 i386 中,也有信号相关的功能。