找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4131|回复: 2

TP的学习笔记:CPUID指令的使用

[复制链接]

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2017-8-11 03:42:21 | 显示全部楼层 |阅读模式
最近在折腾硬件虚拟化技术,涉及到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。

0

主题

111

回帖

0

精华

银牌会员

积分
340
发表于 2017-8-11 10:01:07 | 显示全部楼层
谢谢分享,最近也在研究VT,突然发现有这么好的资料 谢谢

0

主题

20

回帖

0

精华

初来乍到

积分
30
发表于 2019-7-14 14:08:10 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表