防VM的时序检查不能正常工作?

时间:2014-06-04 18:00:19

标签: c linux

是否有人知道时序检查是否仍在检测虚拟环境?我尝试使用rdtsc指令来获取cpu周期并比较真正的linux机器和运行在virtualbox上的linux之间的结果。但结果似乎不稳定。有时候,真机的cpu周期甚至比虚拟机大。这种技术是否假设像cpu速度这样的硬件是一样的?如果是这样,我很困惑它是如何工作的。我甚至找不到真实和虚拟环境之间明显的界限。有谁知道什么可能是错的?这是我的实施:

#define rdtsc(low,high) \
    asm volatile ("rdtsc" : "=a" (low), "=d" (high))

typedef struct {
    int lo;
    int hi;
} longpair;

typedef union {
    longpair ll;
    long long t;    
} timestamp;

void test(){
  printf("test");
}
int main(int argc, char* argv[])
{
  timestamp a,b,c;
  int i;

  rdtsc(a.ll.lo,a.ll.hi);
  test();
  rdtsc(b.ll.lo,b.ll.hi);
  c.t = b.t-a.t;
}

Some results on virtualbox are:
c(hi) = 0   c(lo) = 36162
c(hi) = 0   c(lo) = 41468
c(hi) = 0   c(lo) = 85921
c(hi) = 0   c(lo) = 38840
c(hi) = 0   c(lo) = 24126

Some in real machine are:
c(hi) = 0   c(lo) = 52045
c(hi) = 0   c(lo) = 48382
c(hi) = 0   c(lo) = 47719
c(hi) = 0   c(lo) = 48535
c(hi) = 0   c(lo) = 58879

实际上,我不知道为什么虚拟机中的某些结果甚至低于真机。顺便说一句,我在两台计算机上测试虚拟机和真实环境,可能有不同的硬件配置。我不知道这是否是这些结果的原因。如果是这样,有没有办法改善这一点?感谢。

1 个答案:

答案 0 :(得分:3)

您无法通过测量一个类型的操作所用的时间来检测虚拟化 - 考虑到大量不同的CPU,并发工作负载等,您无法知道预期的时间是多少应该。此外,使用现代硬件虚拟化(VT-x等),在VM中运行的普通代码与直接在硬件上运行的代码不一定会显着减慢。

正如文章Virtualization Detection: New Strategies and Their Effectiveness所解释的,检测虚拟化存在的一种技术是比较两个操作的运行时间,这两个操作在没有虚拟化但需要不同数量的情况下应该花费相同的时间。虚拟化的时间。本文给出了无操作与cpuid指令的示例。在物理硬件上,cpuid将花费与无操作相同的时间。在虚拟化环境中,cpuid通常会陷阱到虚拟机管理程序(以便虚拟机管理程序可以修改结果),因此比无操作时间长得多。