我正在学习RDTSC,并学习如何为VirtualBox和VMWare等虚拟机进行虚拟化。为什么Intel/AMD要大费周章地虚拟化这个指令?
我觉得它可以很容易地模拟陷阱,它并不是一个非常常见的指令(我测试过,在禁用硬件RDTSC虚拟化的虚拟机中,一般使用没有明显的减速)。
但是,我知道Intel/AMD不会大费周章地把这条指令添加到虚拟化硬件中,除非它对执行速度非常重要。
有人知道为什么吗?
通常使用RDTSC来获取细粒度的定时信息,在这种情况下,虚拟化陷阱的开销会相当大。最常见的用法是有两个RDTSC指令,它们之间有少量代码,将时间的差值作为代码序列的运行时间(周期数)。因此,即使是管道排水/冲洗的开销也是相当可观的。
此外,由于所有指令所做的都是读取一个持续运行的计数器,因此虚拟化它非常容易——硬件只需要允许在VM上下文切换上保存/重新加载计数器值,而不需要为RDTSC指令本身做任何特殊的操作。
vm应该能够有单独的tsc,因为它们在不同的时间启动。物理CPU只有一个,所以至少需要一些东西来获得单个的、每个虚拟机的TSC偏移量。
此外,由于虚拟机不完全拥有底层物理cpu,也就是说,它们不能一直在它们上执行,它们的tsc也应该以某种方式反映"开/关"周期,并且它们不应该在实际时间内突然改变值,这是可取的,虚拟机应该仍然从主机操作系统获得正确的值,因为有很多软件是虚拟化的未准备好,当数字太off时可能会中断。
我认为这些就是RDTSC被虚拟化的原因。但无论你做什么,满足相互矛盾的要求都是困难的,而且会使事情复杂化。您无法在隐藏虚拟化的同时让虚拟机以接近本机的速度运行。这是一种权衡,有些东西必须让步。