CPUID实验
一、CPUID是什么:
百度百科:CPUID操作码是一个面向x86架构的处理器补充指令,它的名称派生自CPU识别,作用是允许软件发现处理器的详细信息。它由英特尔在1993年引入奔腾和SL增强486处理器。 通过使用CPUID操作码,软件可以确定处理器的类型和特性支持(例如MMX/SSE)。CPUID操作码为0Fh、A2h(双字节形式,A20Fh为单字(word))形式,值位于EAX寄存器中,某些情况下ECX寄存器用于指定要返回的信息。
信息提炼:是intel推出的用于CPU信息识别的操作码。
二、找到cpuid的操作手册:经过关键词搜索cpuid似乎并不能找到完整的操作手册,于是更换搜索方向,只要找到intel的开发手册就可以间接的找到cpuid的操作手册。经过搜索,在以下地址可以下载intel的开发手册:
Intel® 64 and IA-32 Architectures Software Developer Manuals
下载手册到本地
打开手册并搜索关键词cpuid,经过一番尝试在卷2中找到cpuid的操作手册
三、熟悉cpuid的数据手册
由以下描述信息可以知道该指令是用来读取处理器的各种标识和特性信息,并将指令执行完后返回的信息保存在 EAX, EBX, ECX,和 EDX 寄存器中。
由以下描述信息可以知道EFLAGS寄存器的bit21位表明处理器是否支持CPUID指令,如果可以设置或者清除该标志位,那么代表处理器支持CPUID指令。
由以下描述信息可以知道CPUID指令有两组功能:一组返回的是基本信息,另一组返回的是扩展信息。
以下为cpuid指令返回信息的部分相关描述(功能太多,这里截取的是部分)
由以下介绍信息可以知道当给EAX寄存器赋值0时,它可以返回cpu的基本信息,对于Intel处理器,该字符串为" GenuineIntel ",并表示为:
四、实际操作
①在真实的dos环境下利用debug进行测试:
- 在eax中写入0,然后执行cpuid,之后可以看到
EBX=756E6547 ECX=6C65746E EDX=49656E69与数据手册上一致
- 在eax中写入80000002h,然后执行cpuid,之后可以看到
EAX=65746E49 EBX=2952286C ECX=726F4320 EDX=4D542865
在eax中写入80000003h,然后执行cpuid,之后可以看到
EAX=33692029 EBX=3130312D ECX=43203030 EDX=40205550
在eax中写入80000004h,然后执行cpuid,之后可以看到
EAX=362E3320 EBX=7A484730 ECX=00000000 EDX=00000000
由数据手册可得,80000002h, 80000003h, 80000004h返回处理器名称/商标字符串
将EAX,EBX,ECX,EDX中的数据用ASCII码表示可得商标字符串。
②编程进行cpuid的读写
- 参考数据手册
- 写出对应的代码
其中EAX中的数据表示Maximum Input Value for Basic CPUID Information
EBX,ECX,EDX结合起来存CPU的品牌名。
- 参考数据手册
- 写出对应的代码
其中 eax中存放的是CPU的基本信息,包括版本,类型,步进ID等,ECX和EDX中存放的是特征信息。
- 参考数据手册
- 写出对应代码:
这里用一个数组来存放TLB相关信息。
- 参考数据手册
- 写出对应代码
- 参考数据手册
- 写出对应代码
0x80000002, 0x80000003, 0x80000004都是用来存 Processor Brand String,这里定义一个大的数组processor_brand来存。
最后将获得的信息进行打印输出
在实际的DOS环境中将代码进行运行,成功的进行了打印输出。