|
最近在折腾硬件虚拟化技术,涉及到CPUID的事情也比较多,这里做一下分享。
CPUID指令主要用于获取CPU特性,比方说可以用于检测CPU是否支持硬件虚拟化技术。
使用方法:将主要查询号放进eax寄存器中,在部分需要用到次要查询号的时候,将次要查询号放进ecx寄存器中。cpuid指令执行后,信息会被分别存放到四个寄存器中:eax,ebx,ecx,edx.
在使用C语言通过WDK进行驱动开发时,不需要通过内联汇编来使用cpuid。微软提供了特别的编译器内置宏(Compiler Intrinsics)来调用cpuid指令,在MSDN中关于该内置宏有详细的使用方法的说明:https://msdn.microsoft.com/en-us/library/hskdteyh(v=vs.100).aspx
不需要使用次要查询号的时候,调用__cpuid,反之则调用__cpuidex即可。
实例:
判定CPU是Intel还是AMD的方法:
将eax设为0(可通过xor eax,eax来实现)后执行cpuid指令。
以ebx,edx,ecx的顺序,将数据存放在12个字节的字节数组里,将其print出来。若print结果为"GenuineIntel",则为Intel的CPU,若print结果为"AuthenticAMD",则为AMD的CPU。
检测CPU是否支持硬件虚拟化的方法:
在Intel x86架构上,将eax寄存器设为1,若执行cpuid指令后,ecx寄存器的第五位置位,则该CPU支持Intel VT-x技术(VMX架构)。
在AMD64架构上,将eax寄存器设为0x80000001,若执行cpuid指令后,ecx寄存器的第二位置位,则该CPU支持AMD-V技术(SVM架构)。
由于内容繁多,不详细讲下去了。
针对Intel x86架构,具体请参考《Intel 64 and IA-32 Architectures Software Developer's Manual》,第二卷第三章,章节3.2。
针对AMD64架构,具体请参考《AMD64 Architecture Programmer's Manual》,第三卷第三章,以及附录D。 |
|