一、CPUID简介

CPUID操作码是一个面向x86架构的处理器补充指令,它的名称派生自CPU识别,作用是允许软件通过CPUID指令读取处理器的详细信息。

二、CPUID基本原理

CPUID有很多function号,每个号代表一个功能。
CPUID指令的基本原理是:

  • 1.先将function号,写入EAX寄存器;
  • 2.再执行cpuid指令;
  • 3.执行结果会被放入到EAX、EBX、ECX 及 EDX 寄存器,通过读取这4个寄存器,就可以获取到该function号对应的数据信息。

比如:
EAX=0,获取CPU的Vendor ID
EAX=1,处理器签名(Processor Signiture)和功能(Feature)位

有一部分function号下面,还有子页号,所以这种情况需要将function号和子页号,分别写入EAX和ECX寄存器,然后再执行cpuid指令,执行结果依然通过EAX、EBX、ECX、EDX进行返回。

关于CPUID指令有多少个function,可以参考PPR for amd family 17h model 31h b0.pdf中2.1.13.1 CPUID Instruction Functions章节:
https://developer.amd.com/wp-content/resources/55803_B0_PUB_0_91.pdf

三、CPUID编程实现

在windows下可以调用__cpuid和__cpuidex这两个函数,__cpuid函数在VS2005中就已经开始支持了。 https://msdn.microsoft.com/en-us/library/hskdteyh(v=vs.140).aspx

下面是简单的调用代码,在windows下VS不支持x64项目嵌入asm,所以只能编译32位版本。

#include<stdio.h>
#include<stdlib.h>// gcc cpuid.c -o cpuid
// cl /DWIN32=1 cpuid.cstatic void cpuInfo(unsigned int cpuinfo[4], unsigned int fn_id)
{unsigned int deax,debx,decx,dedx;
#ifdef WIN32__asm{mov eax,fn_id ; 将参数赋值给eaxcpuid            ; 执行cpuid指令mov deax,eax ; 将寄存器值赋值给临时变量mov debx,ebxmov decx,ecxmov dedx,edx}#elif defined(__GNUC__)__asm__ ("cpuid":"=a"(deax),"=b"(debx),"=c"(decx),"=d"(dedx):"a"(fn_id));
#endifcpuinfo[0]=deax;cpuinfo[1]=debx;cpuinfo[2]=dedx;cpuinfo[3]=decx;
}int main(int argc,char** argv)
{unsigned int fn_id = 0;if(argc == 2){fn_id = atoi(argv[1]);}unsigned int cpu[4];cpuInfo(cpu,fn_id);printf("%08X-%08X-%08X-%08X\n",cpu[0],cpu[1],cpu[2],cpu[3]);return 0;
}

参考链接:
《CPUID讲解》
《CPUID指令简单调用》
《CPUID 指令的使用》
《linux cpuid指令,通过CPUID指令获取CPU信息》


若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

通过CPUID指令读取处理器信息相关推荐

  1. java cpuid_用cpuid指令读取CPU信息

    用cpuid指令读取CPU信息 #include int main() { unsigned int eflags1, eflags2 = 0; unsigned int eax = 0; unsig ...

  2. 【汇编优化】之CPUID获取x86处理器信息

    ###1.CPUID - CPU 标识 操作码 指令 说明 OF A2 CPUID 按照最初输入 EAX 寄存器的值,将处理器标识与功能信息返回给 EAX.EBX.ECX 及 EDX 寄存器. 说明 ...

  3. linux cpuid指令,通过CPUID指令获取CPU信息

    1.简介 在计算机领域中需要用到CPU信息的地方有很多.比如,在可信计算中,需要收集终端的软硬件的完整性信息,其中就包含CPU的信息:再比如,一些加密软件需要绑定CPU的某些信息,去生成加密密钥.本文 ...

  4. Intel x86_64使用cpuid指令获取CPU信息

    文章目录 前言 一.cpuid指令简介 1.1 cpuid指令功能 1.2 cpuid指令代码 二.获取处理器信息 2.1 输入参数为0H 2.2 输入参数为01H 2.3 输入参数为0x800000 ...

  5. Delphi编程 -- 使用CPUID指令获取CPU信息(转自大富翁)

    最近到整理了一份CPU的信息,应该算是比较全面的吧. 几乎现在所有的X86 CPU都内置了CPUID指令以辨别真伪,一些CPU厂商例如AMD,VIA等还内置了更加丰富的扩展CPUID指令,用着更方便了 ...

  6. INTEL处理器识别和CPUID指令(二) CPUID指令

    CPUID指令有两套函数,第一套函数返回处理器的基本信息,第二套函数返回处理器的扩展信息.图一总结了CPUID指令所能输出的处理器的基本信息.CPUID指令的输出完全依赖于EAX寄存器的内容,根据EA ...

  7. INTEL处理器识别和CPUID指令(一) CPUID指令与状态寄存器的演变

    按:本系列翻译自INTEl官方的CPUID指令文档<Intel® Processor Identification and the CPUID Instruction>,由于我自身英语水平 ...

  8. Intel x86_64 CPUID指令介绍

    Intel CPUID指令简介 一.CPUID简介 1.1 CPUID 功能简介 1.2 处理器是否支持 CPUID指令 1.3 指令返回基本信息 1.4 指令返回扩展信息 二.CPUID指令参数输入 ...

  9. linux C语言调用Intel处理器CPUID指令的实例

    在之前写的文章中,仅简单讲了一下CPUID指令,通过该指令可以获取很多和处理器相关的信息,如处理器的系列.型号.内存地址是多少位,等等.本文在Linux环境下,使用C语言内嵌汇编的手段使用CPUID指 ...

最新文章

  1. JAVA框架之Hibernate【配置文件详解】
  2. 性能:15个JavaScript本地存储技术的函数库和工具
  3. 论文阅读:Multi-Scale Triplet CNN for Person Re-Identification
  4. 导出.txt / .pdf / .xls
  5. python装饰器setter实现原理_python装饰器、描述符模拟源码实现
  6. linux 误删除mysql表能恢复吗,Linux误删数据恢复
  7. 【MyBatis笔记】07-MyBatis 核心配置文件
  8. 自学篇之----html的所有input标签 以及post和get提交之间的区别
  9. 百度工程师带来干货分享,助你转型AI应用工程师!
  10. 阿里云云计算 45 阿里云云上安全
  11. 动态推荐系统关键技术研究(一)
  12. 基于java的客户关系管理系统的设计与实现(论文+毕业设计)(完整源码可演示)
  13. 微信公众图文消息html,微信公众号图文消息怎么添加图片背景?
  14. Trie树(字典树、前缀树) (小白整理)
  15. 动态页面抓取超级指南_减少页面重量的完整指南
  16. #二维差分# [ssloj 1467] U
  17. maven 插件 aven-assembly--plugin的使用
  18. ElasticSearch排序引起的all shards failed异常
  19. 动态路由rip配置命令
  20. 婚宴座位图html5,婚宴酒席座位安排图 20桌婚宴座位安排图

热门文章

  1. 哪些设备将用于部署酒店WiFi网络解决方案?
  2. d3h 技嘉b365m 黑苹果,技嘉B250M-D3H i5 7400集显完美安装macOS High Sierra
  3. 京东搜索实时 OLAP 探索与实践
  4. linux内核优化,内核参数详解
  5. Orange学习-2 第一个简单的案列
  6. 基于4G工业路由器和无线终端可实现电动汽车充电桩联网
  7. 下午开课(附课时安排) | 北交大《人工智能与大数据应用实战》
  8. BigQuant策略做量化真的能赚钱吗?
  9. User and People
  10. 并发危险:解决多线程代码中的 11 个常见的问题