6

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

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

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

有谁知道为什么?

4

2 回答 2

7

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

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

于 2011-10-12T19:58:09.687 回答
2

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

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

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

于 2011-10-12T20:35:05.413 回答