栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是vdso和vsyscall?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是vdso和vsyscall?

vsyscallVDSO
段用于加速Linux的某些系统调用的机制。例如,

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



然而,这种 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?


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386488.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号