当前位置: 首页 > 知识库问答 >
问题:

什么是vdso和vsyscall?

秋飞鸾
2023-03-14

我做了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]

vdso和vsyscall是什么意思?vsyscall是内存的内核部分吗?如果有人能解释一下这个问题,那就太好了。

共有2个答案

公冶嘉
2023-03-14

我只想补充一点,现在在新内核中,vDSO不仅用于“安全”系统调用,还用于确定哪个系统调用机制是在系统上调用系统调用的首选方法

魏鸿禧
2023-03-14

vsyscall和vDSO段是用于加速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内存的内核部分吗?如果有人可以在这个问题上有所启发,那就太好了。 问题答案: 该 vsyscall 和 VDSO 段用于加速Linux的某些系统调用的机制。例如,通常是通过此机制调用的。引入的第一个机制是 vsyscall ,它是作为执行特定系统调用的一种

  • 问题内容: 有人能说明一下JVM选项是什么和是谁?具体来说,何时/为什么要更改?如何确定合适的尺寸? 这就是文档所说的: -XX:ReservedCodeCacheSize = 32m保留的代码缓存大小(以字节为单位)-最大代码缓存大小。[Solaris 64位,amd64和-server x86:2048m;在1.5.0_06和更早版本中,Solaris 64位和and64:1024m。] 问题

  • 问题内容: 我是CSS的初学者,而前几天我在看一些CSS代码时,发现了以下几行。在我以前学习CSS的教程中,我从未见过像这些行这样的内容。有人可以向我解释这些内容吗?或者给我一个可以学习实现这些内容的资源? 问题答案: 这些是相关渲染引擎(适用于Chrome,Safari;适用于Firefox,适用于Opera,适用于Internet Explorer)提供的供应商前缀属性。通常,在W3最终澄清/

  • 什么是BIOS 系统开机启动 BIOS,即微机的基本输入输出系统(BasicInput-Output System),是集成在主板上的一个ROM芯片,其中保存有微机系统最重要的基本输入/输出程序、系统信息设置、开机上电自检程序和系统启动自举程序。在主板上可以看到BIOSROM芯片,请参见微机主板图。一块主板性能优越与否,很大程度上取决于板上的BIOS管理功能是否先进。 一、BIOS中断例程 即BI

  • 本文向大家介绍什么是KVC和KVO?相关面试题,主要包含被问及什么是KVC和KVO?时的应答技巧和注意事项,需要的朋友参考一下 KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。KVO(Key-Va

  • 我想知道为什么以及何时使用、,甚至可能使用。 我听说它们确实很有用,但我不知道何时使用它们。