检测linux主机是否运行 xen,其原理是读取 CPUID 来判断,Xen 源代码下面有一段检测是否是 Xen 的 C 语言代码 tools/misc/xen-detect.c,这段代码提供了一个很好的例子,重写了代码,用宏替代了函数。xentest.c
#include <stdio.h>
#include <string.h>
#define HYPERVISOR_INFO 0x40000000
#define CPUID(idx, eax, ebx, ecx, edx)\
asm volatile (\
"test %1,%1;jz 1f; ud2a; .ascii \"xen\"; 1: cpuid"\
:"=b" (*ebx), "=a" (*eax),"=c" (*ecx), "=d" (*edx)\
:"0"(idx) );
void main()
{
unsigned int eax,ebx,ecx,edx;
char string[13];
CPUID(HYPERVISOR_INFO, &eax, &ebx, &ecx, &edx);
*(unsigned int *)(string+0) = ebx;
*(unsigned int *)(string+4) = ecx;
*(unsigned int *)(string+8) = edx;
string[12] = 0;
if (strncmp(string, "XenVMMXenVMM",12) == 0) {
printf("xen hvm\n");
} else
printf("bare hardware\n");
}
此程序在ubuntu xen4.12 环境下测试通过,如果在没有安装xen的环境下运行则会出现 “Illegal instruction (core dumped)” 错误,检测 kvm功能有待进一步研究完善,与xen有区别不能通用。