什么是vdso和vsyscall?

我做了sudo cat /proc/1/maps -vv

我试图弄清楚输出。我可以看到许多共享库被映射到内存映射段如预期。

 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p 00009000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00585000-7f3c0059b000 r-xp 00000000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0 7f3c0059b000-7f3c0079b000 ---p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0 7f3c0079b000-7f3c0079c000 r--p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0 

接近尾声的是类似的东西

 7f3c0165b000-7f3c0177e000 rw-p 00000000 00:00 0 [heap] 7fff97863000-7fff97884000 rw-p 00000000 00:00 0 [stack] 7fff97945000-7fff97946000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 

vdsovsyscall是什么意思? 是vsyscall内存的核心部分? 如果有人能够提出这个问题,那将是非常好的。

Solutions Collecting From Web of "什么是vdso和vsyscall?"

vsyscallvDSO是用于在Linux中加速某些系统调用的两种机制。 例如, gettimeofday通常是通过这个机制来调用的。 引入的第一种机制是vsyscall ,它是作为执行特定系统调用的方式添加的,不需要任何真正的特权级别来运行以减少系统调用开销。 在前面的例子之后,所有gettimeofday需要做的是读取内核的当前时间。 有些应用程序经常会调用gettimeofday (例如生成时间戳),以至于他们甚至关心一点点的开销。 为了解决这个问题,内核映射到用户空间一个包含当前时间和快速gettimeofday实现(即只读取保存到vsyscall中的时间的函数)的页面。 使用这个虚拟系统调用,C库可以提供一个快速的gettimeofday ,它没有通过经典系统调用模型INT 0x80SYSCALL引入的内核空间和用户空间之间的上下文切换引入的开销。

但是,这个vsyscall机制有一些限制:分配的内存很小,只允许4个系统调用,更重要的是, vsyscall页面静态分配给每个进程中的相同地址,因为vsyscall页面的位置是钉在核心ABI。 vsyscall的这种静态分配会降低Linux常用的内存空间随机化带来的好处。 攻击者在利用堆栈溢出攻击应用程序之后,可以使用任意参数从vsyscall页面调用系统调用。 他所需要的只是系统调用的地址,因为它是静态分配的(如果你试图在不同的应用程序中再次运行你的命令,你会注意到vsyscall的地址不会改变)。 这将是很好的删除或至少随机的vsyscall页面的位置,以挫败这种类型的攻击。 不幸的是,应用程序依赖于该页面的存在和确切的地址,所以不能做任何事情。

这个安全问题已经通过用特殊的陷阱指令替换固定地址处的所有系统调用指令来解决。 尝试调用vsyscall页面的应用程序会陷入内核,然后在内核空间中模拟所需的虚拟系统调用。 结果是一个内核系统调用仿真一个虚拟系统调用,放在那里以避免内核系统调用。 结果是vsyscall需要更长的时间来执行,但关键的是,并没有打破现有的ABI。 在任何情况下,只有在应用程序尝试使用vsyscall页面而不是vDSO时, 才会看到减速

vDSO提供了与vsyscall相同的功能,同时克服了其局限性。 vDSO(虚拟动态链接共享对象)是用户空间分配的内存区域,以安全的方式暴露用户空间的一些内核功能。 这已经被引入来解决由vsyscall引起的安全威胁。 vDSO是动态分配的,解决了安全问题,可以有4个以上的系统调用。 vDSO链接通过glibc库提供。 链接器将链接到glibc的vDSO功能,只要这样的例程有一个附带的vDSO版本,如gettimeofday 。 当你的程序执行的时候,如果你的内核没有vDSO的支持,那么就会有一个传统的系统调用。

信用和有用的链接:

  • 真棒教程,如何创建自己的vDSO 。
  • vsyscall和vDSO,不错的文章
  • 有用的文章和链接
  • 什么是linux-gate.so.1?

我只是想在现在的新内核中加入vDSO而不是只用于“安全的”系统调用,而是用来决定哪个系统调用机制是调用系统调用syscall的首选方法。