【问题标题】:Why is RDTSC a virtualized instruction on modern processors?为什么 RDTSC 是现代处理器上的虚拟化指令?
【发布时间】:2011-10-12 19:36:20
【问题描述】:

我正在研究 RDTSC 并了解如何将它虚拟化以用于 VirtualBox 和 VMWare 等虚拟机。为什么 Intel/AMD 不厌其烦地虚拟化这条指令?

我觉得它可以很容易地用一个陷阱来模拟,而且它并不是一个超级通用的指令(我测试过,在禁用硬件 RDTSC 虚拟化的虚拟机中一般使用没有明显的减速)。

但是,我知道 Intel/AMD 不会费尽心思将此指令添加到虚拟化硬件中,除非能够非常快速地执行很重要。

有人知道为什么吗?

【问题讨论】:

  • 请注意,根据我的测试,在标准 EC2 实例上,RDTSC 是 not 虚拟化的(我在 this question about haveged 使用了测试 - 这似乎也得到了评论的证实在this thread

标签: hardware virtualization rdtsc


【解决方案1】:

通常使用 RDTSC 来获取细粒度的时序信息,其中虚拟化陷阱的开销非常大。最常见的用途是让两条 RDTSC 指令之间有少量代码,将时间差作为代码序列的经过时间(周期数)。所以即使是管道排水/冲洗的开销也相当大。

此外,由于所有指令都是读取一个连续运行的计数器,因此对其进行虚拟化非常容易——硬件只需要允许在 VM 上下文切换时保存/重新加载计数器值,而不是 RDTSC 指令本身的任何特殊内容.

【讨论】:

  • 好的,我明白了为什么您需要虚拟化来实现短指令序列的非常细粒度的时序。但是,我能想到这样做的唯一原因是研究目的,或侧信道攻击。有什么正当理由吗?几乎感觉 rdtsc 的虚拟化是邪恶的
  • (不是暗示研究不合法 :P ,我的意思是说,“除了细粒度时序研究这一重要但不常见的任务之外,还有其他合理的原因吗?”)
  • 好吧,如果你没有正确虚拟化 RDTSC,它会成为程序检测它是否在虚拟化下运行的一种简单方法,你可能不希望这样做
  • @Robert 如果您要在程序中构建检测分析器,那么拥有一个准确的高频计时器很重要,这样您就可以准确地确定各个函数需要多长时间。例如,如果您的服务器需要始终在 25 毫秒内响应,这一点很重要,这样您就可以跟踪部署后出现的性能问题并对其进行优化。
  • 如果您要制造工业机械或机器人,这也很重要,它们需要以精确的速度运行电机或传感器等。
【解决方案2】:

VM 应该能够具有单独的 TSC,因为它们在不同的时间启动。物理 CPU 只有一个,因此至少需要一些东西来获得单独的、每个 VM 的 TSC 偏移量。

此外,由于 VM 不完全拥有底层物理 CPU,也就是说,它们不会一直在它们上执行,它们的 TSC 也应该以某种方式反映“开/关”周期,这是可取的他们不会突然改变价值w.r.t。实际时间,VM 仍应从主机操作系统获得正确的时间,因为有很多软件尚未准备好虚拟化,并且当数字太差时可能会中断。

我认为这就是 RDTSC 被虚拟化的原因。但无论您做什么,满足相互冲突的要求都很难,而且会使事情复杂化。您无法隐藏虚拟化并让虚拟机同时以接近本机的速度运行。有一些取舍,有些事情必须让步。

【讨论】:

  • 将虚拟机迁移到具有不同 TSC 频率的硬件是另一个原因;这就是支持缩放和偏移的原因。
  • 我认为通常您希望来宾 TSC 在很长时间没有运行任何指令的情况下跳转。通常软件使用 RDTSC 作为绝对时间源,例如对于clock_gettime,(不适用于启动/停止间隔时间),因此任何试图隐藏虚拟机一段时间未运行的事实都意味着向来宾提供不正确的时间。你通常不希望那样。如果您的虚拟机对长时间的暂停很敏感,请不要在会暂停它的虚拟机管理程序上运行它;关闭它而不是暂停它。我猜你的另一个选择是让它的挂钟落后于实时。
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 2015-12-24
  • 2011-11-08
  • 2019-10-18
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多