应用程序如何获知自己是否工作在Xen 虚拟机中呢?
使用CPUID指令可以完成该任务。
uint32_t eax, ebx, ecx, edx, pages, msr, i;
char signature[13];
cpuid(0x40000000, &eax, &ebx, &ecx, &edx);
*(uint32_t*)(signature + 0) = ebx;
*(uint32_t*)(signature + 4) = ecx;
*(uint32_t*)(signature + 8) = edx;
signature[12] = 0;
if (strcmp("XenVMMXenVMM", signature) || (eax < 0x40000002)) {
printk("%s\n", signature);
return -EINVAL;
}
在Xen中,当使用0x40000000作为CPUID的参数时,能够得到“XenVMMXenVMM”这样的字符串。这是在Xen源码中定义的。
\xen\include\public\arch-x86\cpuid.h
**#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */
**#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */
**#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */******