linux 内核编程 差别,linux-kernel – vsdo和vsyscall之间的区别

vsyscall和vDSO段是用于加速Linux中某些系统调用的两种机制.例如,通常通过此机制调用gettimeoftheday.引入的第一个机制是vsyscall,它被添加为执行特定系统调用的一种方法,这些调用不需要任何实际级别的特权来运行以减少系统调用开销.按照前面的示例,gettimeofday所需要做的就是读取内核的当前时间.有些应用程序经常调用gettimeofday(例如生成时间戳),以至于他们只关心一点点开销.为了解决这个问题,内核将包含当前时间和快速gettimeofday实现的页面映射到用户空间(即只读取保存到vsyscall中的时间的函数).使用此虚拟系统调用,C库可以提供快速gettimeofday,它没有内核空间和通常由经典系统调用模型INT 0x80或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支持,则会进行传统的系统调用.

积分和有用的链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值